js沒有面向對象機制,或者說js沒有實例,所有的“實例”都是將原型指向父“類”的一個新變量。
```
var a = {name: 1, set: function(){this.name = 2}}
var b = Object.create(a);
//b沒有name,通過原型鏈找到a的name
b.name; //1
//調用原型鏈上的set,此時this使用了隱式綁定,指向b,因此為b創建了一個name屬性
b.set();
//b --> {name: 2, __proto__: {name: 1, set: function(){this.name = 2}}}
b.name; //2
a.name; //1
```
```
function Foo(who) {
this.me = who;
}
Foo.prototype.identify = function() {
return 'Im ' + this.who;
}
function Bar(who) {
Foo.call(this, who);
}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.speak = function() {
alert(this.identify())
}
var b1 = new Bar('b1');
b1.speak(); //Im b1
//分割線
function Foo(who) {
this.me = who;
}
Foo.prototype.identify = function() {
return 'Im ' + this.who;
}
var b2 = new Foo('b2');
b2.__proto__.speak = function() {
alert(this.identify())
}
b2.speak(); //Im b2
//函數操作prototype,對象操作__proto__,二者實際上是一樣的,只是訪問的名字不一樣
```
- 你不知道的JS上
- 第一部分 第三章 函數作用域和塊作用域
- 第一部分 第四章 提升
- 第一部分 第五章 閉包
- 第二部分 第一章 關于this
- 第二部分 第二章 this全面解析
- 第二部分 第三章 對象
- 第二部分 第五章 原型
- 第二部分 第六章 行為委托
- 你不知道的JS中
- 第一部分 第二章 值
- 第一部分 第三章 原生函數
- 第一部分 第四章 強制類型轉換
- 第一部分 第五章 語法
- 第二部分 第一章 異步
- 第二部分 第三章 Promise
- 第二部分 第四章 生成器
- 第二部分 第五章 性能
- 你不知道的JS下
- 第一部分 總結
- 第二部分 第二章 語法
- 第二部分 第三章 代碼組織
- 第二部分 第四章 Promise
- 第二部分 第五章 集合
- 第二部分 第六章 新增API
- 第二部分 第七章 元編程
- 第二部分 第八章 ES6之后