javascript是以原型为基础的继承机制,不同于java、C#的以类为基础的原型机制。所以习惯了类继承的在理解原型继承的时候不是那么顺利。下面是2者的对比情况:
原型继承:
是以对象为原型来创建新对象的,复用的是对象。
类继承:
是类为模板的来创建新对象的,复用的是类。
javascript是最容易受人误解的语言之一,以原型继承,却因为追当时流行的面向对象语言的风引入了类继承机制语言中用的最广泛的 new关键字。按照我们的理解本来应该引入 create或者Clone,以一个原型对象为基础产生出新的对象。面向原型的继承的大致过程是这样,当我们创建一个新对象时,将这个对象的Prototype指向一个已经存在的对象。当我们访问这个新对象的属性时,如果自己没有这个属性,则沿着原型链向上查找,如果到最顶层仍不存在则返回undefined。当我们给这个对象的一个属性赋值时,不会沿着原型链查找,而是直接根据 haveownpropey 进行判断。如果自己没有则把属性加进来。这样看来原型集成类似于linux的进程机制的写时copy,节省了内存。
function p() { this.name = "name"; } function a(Y) { this.y = Y; this.calc = function() { //console.log(this.x + ";y=" + this.y ); //console.log("_____________________"); console.log(this.name); } } var pp = new p(); a.prototype = pp; var b = new a(10); var c = new a(20); b.calc(); c.calc(); pp.name = "change name"; //在这里我们修改了父对象的值,发现2个子对象的值都发生了改变,可以判断出2个对象是共享一个父对象的。 b.calc(); // change name c.calc();// change name
那么下一步,我们通过其中一个子对象来修改其值来观察一下。
b.name = "change name"; b.calc(); //change name c.calc(); //name 我们发现B的值发生了改变,C的值并没有发生变化。究竟底层是怎么实现的呢?是类似linux的写时copy。 还是发生了其他什么呢?
同步更新与:http://campoem.com/blog/2013/04/master-javascript-prototype/