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为止。
https://github.com/KeNanMi

浙公网安备 33010602011771号