JavaScript中的原型继承

下面的理解是错的,只是个笔记。代表我曾经的思考。

学习JavaScript时需要将prototype和__proto__分清,Quora中有一篇解释挺好。

_________________________________________________________________________________________

 

对于原型继承我现在仍旧比较模糊,但我感觉这完全不是以前子类,父类似的继承。他们有着完全不同的东西。

 

原型是一个object,JavaScript中没有类型的概念。 JavaScript中所有的东西除了基本类型,就是object。一个object的原型也是一个object。我们看代码:

 

function Person(){};
function Worker(){};

var w = new Worker(); 
w.prototype=new Person();   //w(一个object)的原型也是一个object
w.prototype.say = function{alert("hi")}; 

 

这里的say方法只添加到当前的对象(object)w中(直的吗?这个说法其实是模糊的),并不影响Worker()这个函数。 所以当

var w2=new Worker(); 

并不会有say函数的实现。即w与w2是两个独立的object.

如果说w与w2区别就是w对象多了一个say函数?如果这么说的话那w.prototype.say=function{};与w.say=function区别是什么呢?

 

我能想到的区别就是w.say是给当前object加一个属性,而w.prototype.say是给w的原形对象(即通过new Person()创建的一个object)加一个属性。

 

我们来看一段代码:

var w1 = new Worker();    //implicit prototype link 
w1.prototype = new Person();     //explict prototype property
w1.prototype.say = function(){alert('hi')};

var w2 = new Worker();
w2.prototype = new Person();
w2.say = function(){alert('hi')};

var w3 = new Worker();   //implict prototype link to Worker


Worker.prototype.say = function(){};  //Worker prototype adding say can be access by w1.w3
Person.prototype.say = function(){};  //explicit prototype, can't be access by w1.w3

到目前为止我还是不理解,为什么w1.say是undefined, w3.say确是function。

 

我想用图来解释上面一段代码,注意下图中都是对象(object),没有类,即使函数也是对象(想想JavaScript中内置Function对象):

image

posted @ 2012-02-17 13:53  Jerry Chou  阅读(356)  评论(0编辑  收藏  举报