父对象的值未从继承更改为原型

时间:2017-10-05 19:42:22

标签: javascript

我是javascript OOP的新手,请耐心等待我

从继承的对象更改父对象的值学生应该改变人的年龄,但是得到完全相同的值。

<script>
function Person(age){ 
    this.age=age;
}

    function Student(){}

    var person=Student.prototype=new Person(10);
    var oldAge=person.age;
    Student.age=20;
    var newAge=person.age;

    alert("Person old age="+oldAge+"\New age="+newAge);
</script>

personStudent从同一个Person对象继承时,sudent和person的年龄值应该在更改Student的值时发生变化

我已经完成了Prototypical inheritance - writing upJavaScript Inherited Properties Default Value个问题

  

问题是我想通过继承Person属性的Student更改Person的值。

我想我在这里遗漏了一些东西,请帮助我理解这一点。

3 个答案:

答案 0 :(得分:2)

有两种模式用于在javascript中实现继承

  1. 原型面向对象模式
  2. 构造函数面向对象模式
  3. 现在我将使用第一种方法

    一些必备知识:

    1. 所有JS对象都有一个指向原型的属性 对象,因此除了它自己的属性,对象也可以 访问它的原型

    2. __proto__:这是所有对象拥有的属性,这指向  该对象的原型。

    3. Object.create(arg):它用于创建对象和initaliaze     他们的原型或设置他们的__proto__属性。

      Object.create MDN link

      下面的片段实现了继承,并允许您通过Student修改Person的值。 :

    4. &#13;
      &#13;
      function Person(age){ 
          this.age=age;
          this.getAge = function () { return this.age;}
      };
      
      function Student(){};
      
      //Creating Person instance
      var person = new Person(23);
      
      console.log("Old Person age is " + person.age);
      
      //Creating a student instance and inheriting it from person instance
      //Object.create method creates a object whose __proto__ point to the object passed
      //Thus student will be an object having a property __proto__ that would point to person instance
      //This assosciation allows the instance of student to access insatnce of Person
      var student = Object.create(person);
      
      //Change age of person through student
      student.__proto__.age = 24;
      
      console.log("New Person age is " + person.age);
      
      console.log("We can also call parent object methods from child" + " for e.g calling getAge from student" + student.getAge());
      &#13;
      &#13;
      &#13;

      现在使用第二种方法实现类似的功能,可以使用以下代码段:

      &#13;
      &#13;
      function Person(age){ 
          this.age=age;
      }
      
      function Student(){}
      
      //Create person instance
      var person = new Person(23);
      
      console.log("Old age of person is " + person.age);
      
      //Inherit the person instance
      Student.prototype = person;
      
      //create a student object
      var student = new Student();
      
      //Change the person instance age value
      //this change is possible because we
      //can access person object through
      //student.__proto__.
      student.__proto__.age = 24;
      
      console.log("New age of person is " + person.age);
      &#13;
      &#13;
      &#13;

答案 1 :(得分:0)

解释这一点的最简单方法是person.age是实例上的属性,其中Student.age是与您的实例无关的静态属性。

您可以简化整个示例以删除学生,您仍会看到类似于实例属性和静态属性的内容。

function Person(age){ 
    this.age = age;
}

var person = new Person(10);
var oldAge = person.age;
Person.age = 20;
var newAge = person.age;

alert("Person old age=" + oldAge + "\New age=" + newAge);
alert(Person.age);

答案 2 :(得分:0)

在JavaScript中,您应始终使用 原型继承 来实现此功能。

var person = { 
    age: 10
}
var student = Object.create(person);
var oldAge=person.age;
student.age=20;
var newAge=student.age;

alert("Person old age="+oldAge+"\New age="+newAge);

在您的代码中,由于函数Student在 创建阶段 中没有属性年龄,JavaScript引擎将在内存中创建一个名为age的属性。在执行阶段,JavaScript引擎会将20分配给在创建阶段创建的新属性。

如果你在浏览器中执行,你会注意到函数Student有一个名为age的新属性,它等于20。