为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript继承:Object.create与New

JavaScript继承:Object.create与New

繁星coding 2019-11-05 14:43:35
在JavaScript中,这两个示例之间有什么区别:先决条件:function SomeBaseClass(){}SomeBaseClass.prototype = {    doThis : function(){    },    doThat : function(){    }}使用Object.create的继承示例A:function MyClass(){}MyClass.prototype = Object.create(SomeBaseClass.prototype);使用new关键字的继承示例Bfunction MyClass(){}MyClass.prototype = new SomeBaseClass();这两个例子似乎做同样的事情。您何时会选择一个?另一个问题:考虑下面链接(第15行)中的代码,其中对函数自己的构造函数的引用存储在原型中。为什么这有用?https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js摘录(如果您不想打开链接):THREE.ImageLoader.prototype = {    constructor: THREE.ImageLoader}
查看完整描述

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实际的功能。希望它会有所帮助。


查看完整回答
反对 回复 2019-11-05
?
当年话下

TA贡献1890条经验 获得超9个赞

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


在您的情况下是这样。


您何时会选择一个?


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


因此,通常应该选择Object.create。但是,某些旧版浏览器不支持该功能。这就是您看到- new方法过于频繁的原因,因为它通常没有(明显)危害。也看看这个答案。


查看完整回答
反对 回复 2019-11-05
?
三国纷争

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角默认的方式。


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 472 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信