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

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

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

以上是 JavaScript继承:Object.create与New 的全部内容, 来源链接: utcz.com/qa/404914.html

回到顶部