JS原型:继承

时间:2018-10-13 10:17:39

标签: javascript inheritance

From the given MDN Article

enter image description here

为什么我们不能只执行下面的代码而不是图片中给出的代码,它们之间有什么区别?

product_id

4 个答案:

答案 0 :(得分:2)

document.getElementsByTagName('form')[0].onsubmit = function() { //check here the value and return false to stop the submit if(document.getElementById('num').value == "") return false } 创建一个不可调用的对象。即使您将函数(构造函数)作为参数传递,由Object.create创建的对象也不会具有内部Object.create属性,这使得函数对象可以被调用。它不能通过原型链继承。

因此,简而言之,您需要将[[Call]]定义为构造函数(或使用Teacher语法,仍然使它成为构造函数),这是{{1 }}。

答案 1 :(得分:1)

使用构造函数创建新实例时,例如

  const teacher = new Teacher();

然后JS在后台进行以下操作:

1)它创建一个继承构造函数prototype属性的新对象

2)它以this作为新对象来调用构造函数:

 const teacher = Object.create(Teacher.prototype); // 1
 Teacher.call(teacher); // 2

现在,如果您希望老师继承Person的所有方法和属性,则必须使Teacher.prototype继承Person.prototype,因为实例继承了它。所以这个:

  teacher  -> Teacher.prototype
  teacher2 ->

必须更改为

 teacher  -> Teacher.prototype -> Person.prototype
 teacher2 ->

因此,教师原型必须继承人原型。

 Teacher.prototype = Object.create(Person.prototype);

另一行:

  Teacher = Object.create(Person);

几乎没有意义,因为它破坏了Teacher构造函数,因为Object.create返回一个对象而不是一个函数。但是,您可以:

 Object.setPrototypeOf(Teacher, /*to*/ Person);

然后Teacher会继承Person的所有 static 属性,但是实例不会继承任何东西,因为Teacher.prototype不继承{{1} }。

答案 2 :(得分:0)

Teacher = Object.create(Person);

通过上面的代码行,您为教师分配了完全不同的值。

相反,您可能会问以下问题:

Teacher.prototype = Person.prototype

但在这种情况下,问题还在于,对Teacher原型的任何更改也会更改Person原型(因为它们引用了相同的对象),并且可能会产生不良的副作用。

所以

Teacher.prototype = Object.create(Person.prototype);

是正确的

答案 3 :(得分:0)

您的问题有两个子问题。

1)分配Teacher.prototypeTeacher

let Teacher = function() { /* does something */ } // <-- the constructor

Teacher.prototype = Object.create(Person.prototype); // <-- the constructor did NOT lost 
Teacher = Object.create(Person.prototype); // <-- the constructor lost 

在较低版本中,您将丢失Teacher构造函数(当然,如果存在)。在上一个中,您将仅覆盖其原型。

2)分配给Person.prototypePerson

Teacher.prototype = Object.create(Person); // Normally `Person` does not have any properties
Teacher.prototype = Object.create(Person.prototype); // But `Person.prototype` does.

换句话说,可以很好地向Person添加属性,而不是向原型添加属性,但是通常将属性添加到Person.prototype,以便可以被Person的实例继承。

Person.foo = function() {}
const person = new Person()
person.foo // undefined

// vs
Person.prototype.foo = function() {}
const person = new Person()
person.foo // its a function