小编典典

JavaScript继承:Object.create与New

javascript

在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行)中的代码,其中对函数自己的构造函数的引用存储在原型中。为什么这有用?

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

THREE.ImageLoader.prototype = {

    constructor: THREE.ImageLoader
}

阅读 448

收藏
2020-05-01

共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' 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);​

在这种情况下publicPropertyobj本示例一样它的属性也可用于对象。

由于Object.create某些旧版浏览器无法使用,因此您可以使用

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

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

2020-05-01