Javascript Object.create(Class.prototype)在这段代码中做什么?
我正在阅读有关的文章,遇到了一段我不理解的代码:Javascript Object.create(Class.prototype)在这段代码中做什么?,javascript,Javascript,我正在阅读有关的文章,遇到了一段我不理解的代码: SuperHero.prototype = Object.create( Person.prototype ); 实际上,原始代码(大写字母H)中有一个输入错误。如果我不相信它,它就会起作用。然而,如果我真的删除了这一行,一切似乎都是一样的 以下是完整的代码: var Person = function( firstName , lastName ){ this.firstName = firstName; this.lastName
SuperHero.prototype = Object.create( Person.prototype );
实际上,原始代码(大写字母H)中有一个输入错误。如果我不相信它,它就会起作用。然而,如果我真的删除了这一行,一切似乎都是一样的
以下是完整的代码:
var Person = function( firstName , lastName ){
this.firstName = firstName;
this.lastName = lastName;
this.gender = "male";
};
// a new instance of Person can then easily be created as follows:
var clark = new Person( "Clark" , "Kent" );
// Define a subclass constructor for for "Superhero":
var Superhero = function( firstName, lastName , powers ){
// Invoke the superclass constructor on the new object
// then use .call() to invoke the constructor as a method of
// the object to be initialized.
Person.call( this, firstName, lastName );
// Finally, store their powers, a new array of traits not found in a normal "Person"
this.powers = powers;
};
SuperHero.prototype = Object.create( Person.prototype );
var superman = new Superhero( "Clark" ,"Kent" , ["flight","heat-vision"] );
console.log( superman );
// Outputs Person attributes as well as powers
SuperHero.prototype=Object.create(Person.prototype)是什么代码>执行?它完全按照文档中的说明执行: 使用指定的原型对象和 财产 本例中的
proto
是Person
:
该参数表示以下内容:
应该是新创建对象原型的对象
您的代码Object.create(Person.prototype)代码>返回一个对象,该对象复制一个人的属性(在本例中为名字、姓氏和性别),并将其分配给超级英雄
请注意人物
和超级英雄
之间的相似性,它们都包含名字
和姓氏
。还请注意差异,Person
包含一个gender
属性,而您的SuperHero
包含一个powers
属性。它创建一个从Person
构造函数的原型对象继承的新对象
SuperHero.prototype = Object.create( Person.prototype );
如果你这么做的话,那就好像是这样
SuperHero.prototype = new Person();
除了创建Person
实例而不实际调用Person
构造函数中的代码
此对象用作SuperHero
构造函数的原型对象,因此当您创建SuperHero
实例时,它将继承Person
的所有原型属性,以及直接添加到SuperHero
原型对象的任何原型属性
SuperHero.prototype = Object.create( Person.prototype );
这基本上是让超级英雄
继承人物
的所有属性/原型。这与使用new
几乎相同,但使用的是新的ECMAScript 5*Object.create()`way。如果这有助于理解,也可以这样写
SuperHero.prototype = new Person();
我不喜欢特别地链接原型,因为这意味着两个原型是相互交织的,我更喜欢一个是子类,一个是超类
亲自去看他们的一个好方法就是做这样的事情。在这里,您可以真正看到SuperHero
从Person
获得的继承。请注意,它具有所有属性(first/last/etc),并具有额外的权限
Realted:Ahhh,所以如果有
Person.prototype.die=function(){…}
我就可以做superhero.die()
?@Duopixel:没错。)原型链将按照object->SuperHero.prototype->Person.prototype->object.prototype->null的顺序进行搜索
@graystateiscoming+1 btw-快速提问:“不实际调用Person构造函数中的代码”。这一部分让我很反感,你这是什么意思?@mcpDESIGNS:在ECMAScript 3中,只能通过调用构造函数来创建自定义对象。因此,要创建Person
,需要使用new
调用Person
函数,如var p=new Person()
中所述。但是在ECMAScript 5中,我们得到了Object.create
,它允许我们创建一个对象,该对象与使用new
创建的对象具有完全相同的原型链,只是我们不需要实际调用Person
函数。如果我们想要一个普通的Person
对象,而不需要构造函数的副作用,这一点非常有用。@mcpDESIGNS:现在就使用它!:)这是一个垫片,可以让您执行几乎相同的操作。它不支持Object.create
的第二个参数,也不允许您将null
用作原型对象,但它允许您创建从指定原型继承的对象。享受!:)<代码>对象。创建不复制任何属性。使用object.create(Person.prototype)
创建的对象将不具有firstName
、lastName
和gender
属性,这些属性都是在Person
构造函数中分配的。但它实际上甚至没有获得它们。。。也就是说,除非它们被手动复制到对象中,在本例中,该对象位于SuperHero
构造函数中,并带有Person.call(this,firstName,lastName)代码>其中人员
功能将直接分配他们。但它不是来自对象.create(Person.prototype)
,因为这些属性不是原型。@grayState表明它们继承了这些属性。不,这些属性不是继承的。由于Person.call(this…
调用),它们被直接分配给对象。