首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript继承: Object.create与new

JavaScript继承: Object.create与new
EN

Stack Overflow用户
提问于 2012-10-24 07:07:37
回答 4查看 43.9K关注 0票数 125

在JavaScript中,这两个示例有什么不同:

前提条件:

代码语言:javascript
复制
function SomeBaseClass(){
}

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

    doThat : function(){
    }
}

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

代码语言:javascript
复制
function MyClass(){
}

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

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

代码语言:javascript
复制
function MyClass(){
}

MyClass.prototype = new SomeBaseClass();

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

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

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

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

代码语言:javascript
复制
THREE.ImageLoader.prototype = {

    constructor: THREE.ImageLoader
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-24 08:47:46

在你的问题中,你提到了Both examples seem to do the same thing,这根本不是真的,因为

您的第一个示例

代码语言:javascript
复制
function SomeBaseClass(){...}
SomeBaseClass.prototype = {
    doThis : function(){...},
    doThat : function(){...}
}
function MyClass(){...}
MyClass.prototype = Object.create(SomeBaseClass.prototype);

在本例中,您只是继承了SomeBaseClass' prototype,但是如果您的SomeBaseClass中有一个属性,比如

代码语言:javascript
复制
function SomeBaseClass(){ 
    this.publicProperty='SomeValue'; 
}

如果你像这样使用它

代码语言:javascript
复制
var obj=new MyClass();
console.log(obj.publicProperty); // undefined
​console.log(obj);​

obj对象不会像in this example那样具有publicProperty属性。

您的第二个示例

代码语言:javascript
复制
MyClass.prototype = new SomeBaseClass();

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

代码语言:javascript
复制
    var obj=new MyClass();
    console.log(obj.publicProperty); // SomeValue
    console.log(obj);​

在这种情况下,obj对象也可以使用它的publicProperty属性,比如in this example

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

代码语言:javascript
复制
if(!Object.create)
{
    Object.create=function(o){
        function F(){}
        F.prototype=o;
        return new F();
    }
}

上面的代码只是添加了Object.create函数,如果它不可用,那么你可以使用Object.create函数,我认为上面的代码描述了Object.create的实际作用。希望它能在某种程度上有所帮助。

票数 114
EN

Stack Overflow用户

发布于 2012-10-24 07:29:38

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

在你的情况下是这样的。

什么时候你会选择其中一个呢?

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

因此,您通常应该更喜欢Object.create。然而,它在一些传统浏览器中不受支持;这就是您经常看到new-approach的原因,因为它通常不会造成(明显)危害。也可以看看this answer

票数 39
EN

Stack Overflow用户

发布于 2012-10-24 07:12:06

如果您按照预期使用Object.create(),那么区别就会变得很明显。实际上,它完全隐藏了您的代码中的prototype单词,它将在引擎盖下完成这项工作。使用Object.create(),我们可以像这样

代码语言:javascript
复制
var base =  {
    doThis : function(){
    },

    doThat : function(){
    }
};

然后,我们可以从此扩展/继承其他对象

代码语言:javascript
复制
var myObject = Object.create( base );
// myObject will now link to "base" via the prototype chain internally

所以这是另一个概念,一种更“面向对象”的继承方式。例如,使用Object.create()时没有现成的“构造函数”。当然,你也可以在这些对象中创建和调用一个自定义的构造函数。

使用Object.create()的一个理由是,与使用Javascripts默认方式相比,混合/*继承*来自其他对象可能看起来更自然。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13040684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档