You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function Animal (name) {
this.name = name;
}
var cat = new Animal('dog');
var cat = new Animal('dog');是关键代码,js引擎在执行这句代码的时候,内部做了很多工作,用伪代码模拟一下其内部流程如下:
new Animal('dog') 相当于 {
var obj = {};
obj.__proto__ = Animal.prototype;
var result = Animal.call(obj, 'dog');
return typeof result === 'object' ? result : obj;
}
new 的过程
new
关键字会进行如下的操作:{}
);__proto__
,将该属性链接至构造函数的原型对象prototype
;this
指向步骤1新创建的对象 ;this
。示例讲解
以下面代码为例讲解
var cat = new Animal('dog');
是关键代码,js引擎在执行这句代码的时候,内部做了很多工作,用伪代码模拟一下其内部流程如下:解析上述步骤:
1、新生成一个对象:创建一个空对象
obj
;2、链接到原型:把
obj
的__proto__
指向了构造函数的Animal
的原型对象prototype
。3、绑定
this.call
,apply
,bind
:在obj
对象的执行环境中调用Animal
函数并传递参数dog
,相当于var result = obj.Animal('dog')
,当执行完这句话后obj
就产生了属性name
并赋值“dog”
。4、返回新对象(如果构造函数有自己的
return
,则返回该值):观察第三步的返回值,如果无返回值或者返回一个非对象值,则将obj
作为新对象返回,否则会将result
作为新对象返回。实现一个简单的new方法
测试写的
_new
方法创建对象的方法和区别
var obj = {}
)new
构造器Object.create()
new和Object.create()区别
new
出的实例继承构造函数的属性,Object.create()
出的实例不继承构造函数的属性,Object.create(arg, pro)
创建的对象的原型取决于arg
,arg
为null
,新对象是空对象,没有原型,不继承任何对象;arg
为指定对象,新对象的原型指向指定对象,继承指定对象对象字面量和Object.create区别
Object
构造函数, 简洁且性能更好;Object.create
是实例对象Object
,Object.create(arg, pro)
原型取决于arg
Object.create()
出的实例不继承构造函数的属性参考文献
The text was updated successfully, but these errors were encountered: