var person = new object();
person.name = 'tom';
person.age = 18;
person.say = function
()複製**
var person =
}複製**
function person(name, age)
return o;
}var person1 = person('tom', 18);
var person2 = person('harry', 28);
複製**
function person(name, age)
}var person1 = new person('tom', 18);
var person2 = new person('harry', 28);
複製**
建構函式模式同工廠模式的不同之處:
要建立乙個建構函式的例項需要使用 new 操作符,這種方式呼叫建構函式其實經歷了如下幾個步驟:
上面的 person1 和 person2 為 person 建構函式的兩個不同例項,它們分別有乙個constructor屬性,指向person。檢查是否為某個建構函式的例項可以用 instanceof 操作符。
person1.constructor === person; //true
person2.constructor === person; //true
person1 instanceof person; //true
person2 instanceof person; //true
person1 instanceof object; //true
person2 instanceof object; //true
複製**
建構函式本身也是函式,當它使用 new 操作符來呼叫時就說建構函式,如果不使用 new 操作符來呼叫就是普通的函式。
//作為普通函式呼叫,此時的方法加在了全域性物件上
person('bob', 26);
window.say(); //bob 26
//在另乙個物件的作用域中呼叫,呼叫後 o 就有了所有的屬性和方法
var o = new object();
person.call(o, 'greg', '30');
o.say(); //greg 30
複製**
建構函式的問題 —— 在每建立乙個建構函式的例項時都要重創一遍方法。我們在建立乙個函式時,都會有乙個prototype(原型)屬性,這個屬性是乙個指標,指向乙個物件,這個物件的用途是包含可以由由特定型別的所有例項共享的屬性和方法。如下例子所示:
function
person
(){}
person.prototype.name = 'john';
person.prototype.age = 20;
person.prototype.say = function
() ;
var person1 = new person();
person1.say();
var person2 = new person();
person2.say();
複製**
建立乙個新函式時就會建立乙個該函式的prototype屬性,如上例子中,person建構函式有乙個prototype屬性,該原型物件會獲得乙個constructor(建構函式)屬性,這個屬性指回建構函式,即person.prototype.constructor指回person。通過建構函式我們可以繼續為原型物件新增屬性和方法。
當呼叫建構函式建立例項時,該例項內部將包含乙個指標([[prototype]]),指向建構函式的原型物件。我們可以通過isprototypeof()方法來測試。使用object.getprototypeof()方法可以返回[[prototype]]的值。
person.prototype.isprototypeof(person1); //true
person.prototype.isprototypeof(person2); //true
object.getprototypeof(person1) === person.prototype; //true
object.getprototypeof(person1).name; //'john'
複製**
我們可以為例項新增與原型中同名的屬性來遮蔽原型中的屬性的值,同時也可以用delete 操作符刪除例項屬性,從而重新訪問原型中的屬性。 object的hasownproperty()方法可以檢測乙個屬性是存在於例項中還是原型中。而使用 in 操作符無論是在原型中還是例項中,只要能找到都返回true。 我們也可以用object.keys()方法來檢視傳入物件的所有可列舉的屬性。而object.getownpropertynames()方法會返回傳入物件的所有屬性,無論能不能列舉。
原型物件的問題跟它的共享性有關,當建立乙個物件的兩個例項,改變乙個例項的屬性,另乙個會受影響。
function
person
(){}
person.prototype.name = 'john';
person.prototype.age = 20;
person.prototype.friends = ['bob', 'harry']
person.prototype.say = function
() ;
var person1 = new person();
var person2 = new person();
person1.friends.push('lisa');
person2.friends; //'bob', 'harry', 'lisa'
複製**
如若此時只是想給person1的friends增加單獨的值,就不能達到預期結果。
function person(name, age)
person.prototype =
};var person1 = new person('john', 20);
var person2 = new person('lee', 22);
person1.friends.push('lisa');
person2.friends; //'bob', 'harry'
複製**
以上方式為例項屬性在建構函式中定義,所有例項共享的屬性constructor和方法在原型中定義。
function person(name, age)
}}var g = new person('lucy', 18);
g.say(); //lucy 18
複製**
javascript物件的建立
function createoject name,return object var aa createoject zhangsan nan aa.run 利用第一種方式的問題就是不能識別他是什麼物件 function myobject name,var testobect new myobjec...
JavaScript物件的建立
var person new object person.name cjh person.age 19 var person 需要注意的是,花括號內,成員與成員之間以逗號隔開,而最後乙個成員後不能跟逗號,否則會在ie7及更早的版本中報錯。成員名也可以直接使用字串。其一大優點是可以向函式傳遞大量引數。...
JavaScript建立物件
一 建立單個物件 方式一 object建構函式 var o new object o.key value 方式二 物件字面量 方式一和二缺點 使用相同的介面建立很多物件會產生大量重複 使用方式三解決 方式三 工廠模式 使用函式封裝以特定介面建立物件的細節 function createobject ...