JavaScript 继承:Object.create vs new

2022-08-30 04:51:28

在JavaScript中,这两个例子有什么区别:

先决条件:

function SomeBaseClass(){
}

SomeBaseClass.prototype = {
    doThis : function(){
    },

    doThat : function(){
    }
}

使用 Object.create 的继承示例 A:

function MyClass(){
}

MyClass.prototype = Object.create(SomeBaseClass.prototype);

使用 new 关键字的继承示例 B

function MyClass(){
}

MyClass.prototype = new SomeBaseClass();

这两个例子似乎都做了同样的事情。你什么时候会选择一个而不是另一个?

另一个问题:考虑以下链接(第 15 行)中的代码,其中对函数自己的构造函数的引用存储在原型中。为什么这很有用?

https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js

摘录(如果您不想打开链接):

THREE.ImageLoader.prototype = {

    constructor: THREE.ImageLoader
}

答案 1

在你的问题中,你提到过,这根本不是真的,因为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' prototypeSomeBaseClass

function SomeBaseClass(){ 
    this.publicProperty='SomeValue'; 
}

如果你使用它像

var obj=new MyClass();
console.log(obj.publicProperty); // undefined
​console.log(obj);​

该对象不会具有与此示例中所示的属性。objpublicProperty

第二个示例

MyClass.prototype = new SomeBaseClass();

它执行函数,创建整个对象的实例并继承整个对象。因此,如果您使用constructorSomeBaseClassSomeBaseClass

    var obj=new MyClass();
    console.log(obj.publicProperty); // SomeValue
    console.log(obj);​

在这种情况下,其属性也可用于对象,如本例所示publicPropertyobj

由于 在某些旧浏览器中不可用,因此在这种情况下,您可以使用Object.create

if(!Object.create)
{
    Object.create=function(o){
        function F(){}
        F.prototype=o;
        return new F();
    }
}

上面的代码只是在不可用时添加函数,因此您可以使用函数,我认为上面的代码描述了实际的作用。希望它能以某种方式有所帮助。Object.createObject.createObject.create


答案 2

这两个例子似乎都做了同样的事情。

在你的情况下,这是真的。

你什么时候会选择一个而不是另一个?

当具有函数体时,将使用关键字执行。这通常不是故意的 - 您只想设置原型链。在某些情况下,它甚至可能导致严重问题,因为您实际上实例化了一个对象,其私有范围的变量由所有实例共享,因为它们继承相同的特权方法。其他副作用是可以想象的。SomeBaseClassnewMyClass

因此,您通常应该更喜欢.但是,在某些旧版浏览器中不支持它;这就是你看到 -方法过于频繁的原因,因为它通常不会造成(明显的)伤害。也看看这个答案Object.createnew