3 回答
TA贡献1934条经验 获得超2个赞
在您的问题中您提到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实际的功能。希望它会有所帮助。
TA贡献1890条经验 获得超9个赞
这两个例子似乎做同样的事情。
在您的情况下是这样。
您何时会选择一个?
当SomeBaseClass具有函数体时,将使用new关键字执行。这通常不是故意的-您只想设置原型链。在某些情况下,它甚至可能导致严重的问题,因为您实际上实例化了一个对象,该对象的私有作用域变量在MyClass继承相同的特权方法时被所有实例共享。其他副作用是可以想象的。
因此,通常应该选择Object.create。但是,某些旧版浏览器不支持该功能。这就是您看到- new方法过于频繁的原因,因为它通常没有(明显)危害。也看看这个答案。
TA贡献1804条经验 获得超7个赞
如果Object.create()按预期使用,差异将变得明显。实际上,它确实完全隐藏了prototype代码中的单词,将在幕后起作用。使用Object.create(),我们可以像
var base = {
doThis : function(){
},
doThat : function(){
}
};
然后我们可以从中扩展/继承其他对象
var myObject = Object.create( base );
// myObject will now link to "base" via the prototype chain internally
因此,这是另一个概念,一种更“面向对象”的继承方式。例如,没有开箱即用的“构造函数” Object.create()。但是,当然,您可以在这些对象中创建并调用一个自定义的构造函数。
使用一个论据Object.create()是,它可能看起来更自然,以混合 / * *继承其他对象,不是使用Javascript角默认的方式。
添加回答
举报