猿问

JavaScript继承:Object.create与New

在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

}


繁星coding
浏览 473回答 3
3回答

撒科打诨

在您的问题中您提到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); // undefinedconsole.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实际的功能。希望它会有所帮助。

当年话下

这两个例子似乎做同样的事情。在您的情况下是这样。您何时会选择一个?当SomeBaseClass具有函数体时,将使用new关键字执行。这通常不是故意的-您只想设置原型链。在某些情况下,它甚至可能导致严重的问题,因为您实际上实例化了一个对象,该对象的私有作用域变量在MyClass继承相同的特权方法时被所有实例共享。其他副作用是可以想象的。因此,通常应该选择Object.create。但是,某些旧版浏览器不支持该功能。这就是您看到- new方法过于频繁的原因,因为它通常没有(明显)危害。也看看这个答案。

三国纷争

如果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角默认的方式。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答