1.1 原型.
prototype: 每个函数对象都有自己的 prototype 属性, 这个属性是一个指针, 指向对象的原型对象, 包含所有实例共享的属性和方法.
通过给原型添加属性和方法来可以给对象添加属性或方法:
- function Person() {}
- Person.prototype.name = 'Tony';
- Person.prototype.age = 18;
- Person.prototype.sayName= function() {
- alert(this.name);
- }
- var person = new Person();
- person.sayName(); // 'Tony'
1.2 原型链
_ proto_ : 原型链, 实例对象通过原型链去构造函数中查找对应属性
JavaScript 中的对象有一个内置属性 _ proto_, 是对其他对象的引用. 几乎所有对象在创建时 _ proto_ 属性都会被赋予一个非空的值.
- var obj = { a: 1 };
- obj.a; //1
当你试图引用对象的属性时, 如上 obj.a, 会触发 [[Get]] 操作, 对于默认的 [[Get]] 操作, 第一步是检查对象本身是否有这个属性, 有的话就使用它, 若 a 不在 obj 中, 就会继续访问对象的 _ proto_ 链, 如下:
- var obj = { a: 2 };
- // 创建一个关联到 obj 的对象
- var newObj = Object.create(obj);
- newObj.a; //2
newObj 本身不存在 a 属性, 因此会继续访问 newObj 的 _ proto_ 链, 在 obj 中找到了 a 属性对应的值 2. 若 obj 中也找不到 a 且 _ proto_ 链不为空, 则会继续查找下去, 直到找到属性或查找完整条原型链.
所有普通对象的原型链最终都会指向内置的 Object.prototype, 它包含 JavaScript 中许多通用的功能:.toString(),.valueOf(),.hasOwnProperty() 等.
1.3 原型和原型链
实例对象._ proto_ = 构造函数. prototype
构造函数. prototype 包含 constructor 和 _ proto_ 两个属性, constructor 即为构造函数本身, _ proto_ 为原型链, 是每个对象在创建时初始化的一个属性, 当我们访问一个属性时, 如果这个对象内不存在这个属性, 就会去他的 _ proto_ 里面找这个属性, 这样一层一层的找下去.
构造函数. prototype.constructor = 构造函数
来源: http://www.jianshu.com/p/01f7a2befb41