当前位置: 首页 > 面试题库 >

JavaScript继承:Object.create与New

魏明亮
2023-03-14
问题内容

在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
}

问题答案:

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



 类似资料:
  • 问题内容: 我一直在努力解决ECMAScript 5中引入的新方法。 通常,当我想使用继承时,我会执行以下操作: 我只是将一个新创建的Animal对象分配给Dog的原型,一切都像一个吊饰一样工作: 但是人们(没有解释)说这不是继承的工作方式,我应该使用Object.create方法: 这也有效。 使用有什么好处,或者我错过了什么? 更新:有人说也可以。所以现在我很困惑 问题答案: 在下面的内容中,

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 本文向大家介绍浅谈JavaScript对象与继承,包括了浅谈JavaScript对象与继承的使用技巧和注意事项,需要的朋友参考一下 JavaScript是我在C语言之后接触的第二门编程语言,大一暑假的时候在图书馆找了一本中国人写的JavaScript程序设计来看。那个时候在编程方面几乎还是小白,再加上那本书根本没有提JavaScript的编程机制,又有一些误导性的话,一直以来对JavaScript

  • 本文向大家介绍JavaScript中的继承之类继承,包括了JavaScript中的继承之类继承的使用技巧和注意事项,需要的朋友参考一下 继承简介       在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以

  • 本文向大家介绍JavaScript 类继承,包括了JavaScript 类继承的使用技巧和注意事项,需要的朋友参考一下 示例 继承的工作方式与其他面向对象的语言相同:在超类上定义的方法可在扩展子类中访问。 如果子类声明了自己的构造函数,则它必须先通过调用父构造函数,super()然后才能进行访问this。            

  • 问题内容: 假设我有两个班级:动物和狗。狗是动物的子类。我执行以下代码: 现在,我可以通过a变量来调用Dog类的方法。 但是我的问题是:如果我可以通过Dog对象(继承性)调用Animal的所有方法,那么为什么要使用多态原理呢?我可以声明: 通过此声明,可以使用所有Animal方法和Dog方法。那么为什么要使用多态呢?非常感谢您的回答。 问题答案: 在Java中,多态和继承的概念被“焊接在一起”。通