在您的问题中,您提到Both examples seem to do the same thing
,这根本不是真的,因为
你的第一个例子
function SomeBaseClass(){...}
SomeBaseClass.prototype = {
doThis : function(){...},
doThat : function(){...}
}
function MyClass(){...}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
在这个例子中,你只是继承SomeBaseClass' prototype
,但如果你在你有一个属性SomeBaseClass
像
function SomeBaseClass(){
this.publicProperty='SomeValue';
}
如果你像这样使用它
var obj=new MyClass();
console.log(obj.publicProperty); // undefined
?console.log(obj);?
该obj
对象将没有此示例中的publicProperty
属性。
你的第二个例子
MyClass.prototype = new SomeBaseClass();
它正在执行该constructor
函数,并创建一个实例SomeBaseClass
并继承整个SomeBaseClass
对象。所以,如果您使用
var obj=new MyClass();
console.log(obj.publicProperty); // SomeValue
console.log(obj);?
在这种情况下publicProperty
,obj
像本示例一样,它的属性也可用于对象。
由于Object.create
某些旧版浏览器无法使用,因此您可以使用
if(!Object.create)
{
Object.create=function(o){
function F(){}
F.prototype=o;
return new F();
}
}
上面的代码只是在Object.create
功能不可用时添加了功能,因此您可以使用Object.create
功能,我认为上面的代码描述了Object.create
实际的功能。希望它会有所帮助。