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…
调用),它们被直接分配给对象。