在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,这根本不是真的,因为
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像
SomeBaseClass' prototype
SomeBaseClass
function SomeBaseClass(){ this.publicProperty='SomeValue'; }
如果你像这样使用它
var obj=new MyClass(); console.log(obj.publicProperty); // undefined console.log(obj);
该obj对象将没有此示例中的publicProperty属性。
obj
publicProperty
你的第二个例子
MyClass.prototype = new SomeBaseClass();
它正在执行该constructor函数,并创建一个实例SomeBaseClass并继承整个SomeBaseClass对象。所以,如果您使用
constructor
var obj=new MyClass(); console.log(obj.publicProperty); // SomeValue console.log(obj);
在这种情况下publicProperty,obj像本示例一样,它的属性也可用于对象。
由于Object.create某些旧版浏览器无法使用,因此您可以使用
Object.create
if(!Object.create) { Object.create=function(o){ function F(){} F.prototype=o; return new F(); } }
上面的代码只是在Object.create功能不可用时添加了功能,因此您可以使用Object.create功能,我认为上面的代码描述了Object.create实际的功能。希望它会有所帮助。