js面向对象之原型链

对于c/c++/java,继承的方法直接用相应的语法继承,但是javaScript不一样,js是采用原型继承的思路来实现面向对象的。

js-类

在js中并没有class的概念,使用了一个函数,运行new的时候会为函数生成一个对象,对象含有隐藏的属性_proto_,这个属性的值就是对fun.prototype的引用。

例如下面的person函数:

function Person(name, gender) {
    this.name = name;
    this.gender = gender;
}
var a = new Person("jason", 'male');
var b = new Person("Amy", 'female');

console.log(a.name);
console.log(b.gender);

共享属性和方法

为了共享属性和方法,就要用的这个属性--prototype,每个函数都有prototype属性,通常是一个空的对象。如果加点东西,那么这个函数构造出来的对象都能访问到。

比如说下面这个例子:

 

function stu(name, gender) {
    this.name = name;
    this.gender = gender;
}

console.log(stu.prototype);
stu.prototype = {
    age : '12'
};

var a = new stu("Amy", 'female');
var b = new stu("Maik", 'male');

console.log(a.age);
console.log(b.age);

stu.prototype.age = '15';

console.log(a.age);
console.log(b.age);

 

由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像"继承"了prototype对象一样。

这就是js的继承设计思想。

那什么是原型链呢?请看下面的例子:

functionPerson(name, gender){
  this.name = name;
  this.gender = gender;
}
console.log(Person.prototype); // {} 是一个空对象
Person.prototype = {
  country: 'China'
};
var a = new Person("Jason", 'male');
var b = new Person("Amy", 'female');

a.__proto__ == Person.prototype
a.__proto__.__proto__ == Person.prototype.__proto__ == Object.prototype

上面的例子就是一个原型链,a继承person,所以a带了一个_proto_属性,它的值指向Person.prototype,是一个引用。意思就是说这个实例对象直接 instanceof Person 的。而 Person.prototype.__proto__ 也是一个对象呀,因为 Person.prototype 是直接由Object生成的,所以 Person.prototype.__proto__ == Object.prototype

所以说,a对象是继承自Person的原型对象( Person.prototype ),而Person的原型对象又继承自Object的原型对象,这样就构成了原型链。

所以调用某个对象的属性的时候,如果发现对象没有这个属性,那就往上查直到查到Object为止。

 

posted @ 2017-03-23 11:40  糊涂一点web  阅读(132)  评论(0)    收藏  举报