达尔文的进化论VS柏拉图的理念论

js 中每个对象都有一个__proto__属性,每个函数(函数也是对象)自然也有,但函数还有一个prototype属性。

function A(){this.x=0;}
var a=new A();
alert(a.__proto__===A.prototype)//true

以上构造函数相当于做了这三件事: 

1.创建一个对象a={ }
2.初始化它,A.call(a)
3.将a.__proto__属性赋值:a.__proto__=A.prototype

当a调用它没有的属性时,就去找a.__proto__也就是A.prototype中的同名属性。

下面一个有趣的例子:

function A(){}
A.prototype.v=1;
var a=new A();// a.__proto__指向A.prototype

A.prototype={v:2};
var a2=new A();// a2.__proto__指向新的A.prototype,但a.__proto__没变

alert(a.v);// 1
alert(a2.v);//2



柏拉图认为造物主以理念世界为蓝图或模型,造出世界万物体。如果把java类和对象的概念比作柏拉图的理念论,js则可以被比作达尔文的进化论。js没有类这个概念,每个对象都可以有或多或少的变异

你可能感兴趣的:(js,prototype,__proto__)