我是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>
当person
和Student
从同一个Person
对象继承时,sudent和person的年龄值应该在更改Student的值时发生变化
我已经完成了Prototypical inheritance - writing up和JavaScript Inherited Properties Default Value个问题
问题是我想通过继承Person属性的Student更改Person的值。
我想我在这里遗漏了一些东西,请帮助我理解这一点。
答案 0 :(得分:2)
有两种模式用于在javascript中实现继承
现在我将使用第一种方法
一些必备知识:
所有JS对象都有一个指向原型的属性 对象,因此除了它自己的属性,对象也可以 访问它的原型
__proto__
:这是所有对象拥有的属性,这指向
该对象的原型。
Object.create(arg)
:它用于创建对象和initaliaze
他们的原型或设置他们的__proto__
属性。
下面的片段实现了继承,并允许您通过Student修改Person的值。 :
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;
现在使用第二种方法实现类似的功能,可以使用以下代码段:
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;
答案 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。