写这篇文章基于自己多年的研究(嘿嘿,开个玩笑)
本文属于翻译,但是是按照自己理解的意思翻译的 ,原文链接:http://www.mollypages.org/misc/js.mp
1.所有实例也就是对象 继承于 创建他们函数的 原型对象;
反映在js 代码中形如下:
function foo(){
}
var obj = new foo();
obj 继承于 foo.prototype ;
foo.prototype.x= 21;
console.log(obj.x);
输出结果: 21;
2.不管存在/不存在 __proto__ 属性 ,一般的建议是所有的对象使用原型对象指向创建该对象的函数,这个属性成为javascript标准的一部分被称为 prototype(原型) 。原型对象,一般情况下有一个构造函数属性重新指向回这个原型的函数 ;
so 你可以理解为 :
function foo(){}
var obj = new foo();
obj.prototype = foo;
foo.prototype.constructor = foo ; //原型重新指向 函数本身;
3.原型只用于 通过函数创建出来的对象/实例 属性继承,这个函数本身不会和原型关联(但是 一旦这个函数自己是一个对象了,它将继承至创建它的函数原形,典型的是 javascript 系统的“Function” 对象);
//只能说类似,不能等同
var bar = new Foo(); <==> var bar ={}; Foo.call(bar);
function Foo(){};
var f1 = new Foo();
Foo.prototype.x = "hello";
console.log(f1.x);
console.log(Foo.x);
注解:我们使用 Foo.prototype 来为所有 通过函数Foo 创建出的对象 设置属性 我们不会说 用f1.prototype 来为f1设置属性 ,这是非常重要的一点,需要记住哦;
4.默认 原型 对象可以被用户创建的对象替换,虽然如此,但是构造函数属性必须手动的去复制 ,因为javascript 运行时 会晚于 默认的原型对象
5.默认下原型 对象本身是通过构造函数 Object() 创建的 ,因此原型的原型是Object.prototype ,所以所有的实例/对象 不管类型 最终继承属性从 Object.prototype;
6.所有的对象自动的读取属性在原型链 犹如 那些属性定义在自己的对象中
Setting the same property via the object shadows/hides the same property in the prototype for that instance.
function foo() { }
f1 = new foo();
f2 = new foo();
foo.prototype.x = "hello";
f1.x => "hello"
f2.x => "hello";
f1.x = "goodbye"; //设置 f1.x 隐藏 foo.prototype.x
f1.x => "goodbye" //只会对 f1 隐藏 "hello"
f2.x => "hello"
delete f1.x
f1.x => "hello"; //foo.prototype.x 又重新对 f1 是可见的.
Setting the property directly in the prototype changes it for all instances.
foo.prototype.x = "goodbye";
//now
f1.x => "goodbye"
f2.x => "goodbye";