原⽣JS实现new⽅法、new⼀个对象发⽣的四部、new⾥⾯常⽤的优
先级
⼀、js中new⼀个对象的过程
⾸先了解new做了什么,使⽤new关键字调⽤函数(new ClassA(…))的具体步骤:
1、创建⼀个新对象:
var obj = {};
2、设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象;
obj.__proto__ = ClassA.prototype;
3、使⽤新对象调⽤函数,函数中的this被指向新实例对象:
ClassA.call(obj); //{}.构造函数()
4、将初始化完毕的新对象地址,保存到等号左边的变量中
注意:若构造函数中返回this或返回值是基本类型(number、string、boolean、null、undefined)的值,则返回新实例对象;若返回值是引⽤类型的值,则实际返回值为这个引⽤类型。
var foo = "bar";
function test () {
this.foo = "foo";
}
new test(); //test中的this指新对象,并未改变全局的foo属性
console.log(this.foo); // "bar"
console.log(new test().foo); // "foo";
⼆、⽤原⽣JS实现new⽅法
// 通过分析原⽣的new⽅法可以看出,在new⼀个函数的时候,
// 会返回⼀个func同时在这个func⾥⾯会返回⼀个对象Object,
// 这个对象包含⽗类func的属性以及隐藏的__proto__
function New(f) {
//返回⼀个func
js argumentsreturn function () {
var o = {"__proto__": f.prototype};
f.apply(o, arguments);//继承⽗类的属性
return o; //返回⼀个Object
}
}
⾸先写⼀个⽗类⽅法(包含参数name,age):
function Person(name,age){
this.name = name;
this.age = age;
}
//new⼀个Person的实例p1做研究对⽐
var p1 = new Person("Richard", 22);
//此时p1包含name、age属性,同时p1的__proto__指向Person的prototype
p1.name;//Richard
p1.age;//22
通过⾃定义New⽅法创建⼀个实例对象p2:
var p2 = New(Person)("Jack",25);
p2.name;//Jack
p2.age;//25
此时p2 instanceof Person 返回的是true;
der ="male";
三、优先级问题
:⼩括号(xxx) > 属性访问. > new foo() > foo()
注意new Foo()优先级⾼于Foo();
function getName(){
console.log(1)
}
function Foo() {
console.log(2);
};
return this;
}
console.log(3);
};
//先从.属性访问符号开始往前⾯⼀个最近的对象,同时注意new Foo()优先于Foo();
var a=Name();//3;
属性.的优先级⾼于new foo(),所以===new (Name)();返回Name类型的实例
var b=new Foo().getName();//2;
new foo()的优先级⾼于foo(),所以就相当于new foo()的属性,===(new Foo()).getName();返回undefined
var c=new new Foo().getName();//2;
new foo()优先级低于属性.,所以其实相当于就是new⼀个new foo()的getName属性函数,===new (new Foo().getName)();返回Name类型的实例new Date().getTime();//===((new Date()).getTime)()
(new Date).getTime();//===((new Date()).getTime)()
Time();//Uncaught TypeError: Date(...).getTime is not a function;===new (Time)()
需要注意的是:new Date 其实也是正确的,和new Date()⼀样
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论