[[Prototype]]
.__proto__
.prototype
JavaScript 的內部參考特性
代表物件對 "上層" 物件的參考
every object has [[Prototype]]
except Object.create(null)
Top of [[Prototype]]
usualy Object.prototype
{}Just like [[Prototype]]
every function has one
| .prototype | .__proto__ |
|---|---|
| For function (constructor) | For instances |
think as "Property lookup"
宣告 類別 & 建構器
設定 類別藍圖
產出類別實體
function Foo() {};
Foo.prototype.prop = 'prototype prop';
var foo = new Foo();
console.log(foo.prop); // "prototype prop"
Every Function can be constructor
產生 (建構) 一個新物件
新物件的 [[Prototype]] 指向建構函式的 prototype 屬性
新物件 會被設為 建構函式的 this
預設下,執行完建構函式後就會 return 該新物件
function Foo() {};
Foo.prototype.prop = 'prototype prop';
var foo = new Foo();
console.log(foo.prop); // "prototype prop"
Classic OO
...
...
foo
Foo
.prototype
...
...
foo
(data members & actions)
{
fooAction1: function() {},
fooAction2: function() {}
}[[Prototype]]
JavaScript OO
...
...
Dangerous
foo
function Foo() {};
Foo.prototype.prop = 'prototype prop';
var foo = new Foo();
foo.constructor === Foo; // true
function Bar() {};
Bar.prototype = {};
var bar = new Bar();
bar.constructor === Bar; // false
bar.constructor === Object; // true
child
Child
.prototype
Parent
.prototype
(data members & actions)
(data members & actions)
function Parent() {
this.name = 'name';
}
Parent.prototype.getName = function() {
console.log('parent\'s name:' + this.name);
}
function Child() {
Parent.call(this, arguments); // call parent exmplicitly, not very well
this.label = 'label';
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Child.prototype.getLabel= function() {
console.log('child\'s label:' + this.label);
}
var child = new Child();
child.getName();
child.getLabel();
新建一個物件
其原型物件設為指定的物件
var childProto = Object.create(Parent.prototype);真正的空物件
var emptyObj = Object.create(null);Object.create = function(proto) {
function F() {};
F.proto = proto;
return F.proto;
}
不考慮 enumerable: false 的狀況下
{
childAction1: function() {},
childAction2: function() {}
}{
parentAction1: function() {},
parentAction2: function() {}
}{
childAction1: function() {},
parentAction1: function() {},
childAction2: function() {},
parentAction2: function() {}
}[[Prototype]]
Classic OO
JavaScript OO
child
child
obj instanceof Foo;
Foo.prototype.isPrototypeOf(obj);
Object.getPrototypeOf(obj) === Foo.prototype;
obj.__proto__ === Foo.prototype;
obj.constructor