2017-10-05 64 views
0

上午在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和人的年龄值应改变从学生

改变价值,我已经通过Prototypical inheritance - writing upJavaScript Inherited Properties Default Value问题

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

我想我错过了一些东西,请帮我理解这一点。

+0

[不要使用Student.prototype = new Person(10);'!](https://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-关键字 - 在这里) – Bergi

+0

多数民众赞成在问题@Bergi我想通过学生改变人的价值 – phpdroid

+0

那么你应该[正确从'人'继承'学生'](https://stackoverflow.com/questions/10898786/correct-javascript ),然后使用'var studentOne = new Student();的console.log(studentOne.age); studentOne.age = 20; ...' – Bergi

回答

2

有其中使用在JavaScript来实现继承

  1. 原型面向对象的图案
  2. 构造面向对象的图案

现在,我将使用第一种方法两个图案

一些必备知识:

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

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

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

    Object.create MDN link

    以下片断实现继承,以及允许您通过学生改变人的价值。 :

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());

现在,使用第二方法来实现类似的东西,下面的代码片断可以使用:

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);

+0

当我正确阅读它时很有趣,您只需使用名称'student',它与我的问题没有多大关系! – phpdroid

+0

我觉得你因为我最后的控制台日志而感到困惑,我在最后一个控制台日志中使用了学生,只是为了演示子对象如何调用父对象的方法,顺便提一下,我建议你再次检查我的代码并查看我的第一个和第二个控制台日志在那里你可以看到我通过学生的实例修改了人的年龄,是不是你的原始问题? – varunsinghal65

+0

你已经创建'学生'变量不是'学生'对象你没有使用任何地方'学生'仅限于函数'学生'是未触及 – phpdroid

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); 
+0

问题是我想通过学生继承人的财产来改变人的价值。 – phpdroid

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); 

在代码中,由于功能的学生没有在创建阶段的产权年限,JavaScript引擎将创建一个名为年龄在内存性能。在执行阶段,JavaScript引擎将为创建阶段创建的新属性分配20个值。

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

+0

所以我不能从Student对象中更改Person对象的值吗? – phpdroid

+0

@phpdroid看到我的代码片段,我已经完成了 – varunsinghal65