Javascript-Basic-原型链
文章目录

原型链对象

TL’DR

遍历一个实列的属性时, 先遍历实列对象上的属性, 再遍历它的原型对象, 一直遍历到 Object

一个对象的原型就是它的 constructor 的 prototype 属性的值

创建对象的三种方法

直接创建

1
2
3
4
var obj11 = {
name: 'test1'
};
var obj12 = new Object(name: 'test1'); // 这种方法跟上面一行效果一样.

构造函数

1
2
3
4
var M = function(name) {
this.name = name;
}
var obj3 = new M('test2');

Object.Create()

1
2
3
4
var p = {
name: 'test2'
};
var obj3 = Object.create(p); //此方法创建的对象, 是用原型链连接的, p 是 obj3 的原型

原型链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function Person(name) {
this.name = name;
}

var personOne = new Person("a");
var personTwo = new Person("b");

/* 我们可以在实例创建之后修改对应的原型链, 所有的修改都会反应到对应的实例里面. */

Person.prototype.sayName = function() {
console.log(this.name);
}

personOne.sayName(); // 输出 "a"
personTwo.sayName(); // 输出 "b"

console.log(personOne.__proto__ === Person.prototype); // true
console.log(personTwo.__proto__ === Person.prototype); // true

console.log(personOne.constructor === Person); //true
console.log(personTwo.constructor === Person); //true
console.log(Person.prototype.constructor === Person); //true

console.log(Person.constructor); //function Function(){}
console.log(Person.__proto__.__proto__); // Object{}

修改原型链会出现的情况

如果让原型对象指向另一个类型的实例… 有趣的事情便发生了.
即:

1
2
Var instance1 = new Constructor1();
constructor1.prototype = instance2;

那么如果使用一些方法或者属性,  首先会去找 instance1, 然后找 instance1.__proto__ (即 constructor1.prototype 也就是 instance2 )
如果 instance2 也没有这玩意还会去找 Object 的 原型对象

修改原型链的变化

附录

原型链继承的例子