原型模式
創(chuàng)建每個函數(shù)都有一個原型屬性prototype不铆,這個屬性是一個指針蝌焚,指向函數(shù)的原型對象。默認情況下誓斥,所有原型對象都會自動獲得一個constructor(構造函數(shù))屬性综看,這個函數(shù)包含一個指向prototype屬性所在函數(shù)的指針。
調(diào)用構造函數(shù)創(chuàng)建一個新實例后岖食,該實例的內(nèi)部將包含一個指針(內(nèi)部屬性)红碑,指向構造函數(shù)的原型對象。ECMA-262第五版中,這個指針叫[[Prototype]]析珊。
檢測對象屬性方法:
hasOwnProperty():
檢測一個屬性存在于原型中羡鸥,還是實例中。當給定的屬性存在實例中忠寻,才返回true惧浴。hasOwnProperty 是 Object.prototype 的屬性,創(chuàng)建一個對象奕剃,會繼承Object.prototype上面的所有屬性衷旅。
object.keys(obj):
返回一個包含所有可枚舉屬性的字符串數(shù)組。
// getFoo is a property which isn't enumerable
var myObj=Object.create({},{getFoo:{value:function(){returnthis.foo;}}});
myObj.foo=1;
console.log(Object.keys(myObj));// console: ['foo']
Object.getOwnPropertynames(obj)
返回一個由指定對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)組成的數(shù)組纵朋。
原型鏈
原型鏈的基本模式如下:
function SuperType() {
? ? this.property = true;
}
SuperType.prototype.getSuperValue = function() {
? ? return this.property;
}
function SubType() {
? ? this.subproperty = false;
}
SubType.prototype? = new SuperType();? //繼承了SuperType
SubType.prototype.getSubValue = function() {
? ? return this.subproperty;
}
var instance = new SubType();
console.log(instance.getSuperValue());? ? ? //true
使用不同的方法創(chuàng)建對象:
語法創(chuàng)建:
var? o = {a:1};
構造函數(shù)創(chuàng)建
function Graph() {
? this.vertices = [];
? this.edges = [];
}
var g = new Graph();? ? //? 實例化對象? ?Graph { vertices: [], edges: [] }
Object.create 創(chuàng)建的對象
var a = {a:1};
? var b? = Object.create(a);
? console.log(b);
每個實例對象都有一個私有屬性__proto__指向函數(shù)的原型對象柿顶。
所有函數(shù)的默認原型都是Object的實例,都有一個__proto__屬性操软,指向Object.prototype嘁锯。
class創(chuàng)建對象
class Person {
? ? constructor(name) {
? ? ? ? this.name = name;
? ? }
? ? getName() {
? ? ? ? console.log(this.name);
? ? }
}
var person1 = new Person('tom');
console.log(person1);
參考
JavaScript高級程序設計