創(chuàng)建對象
工廠模式
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name)
};
return 0;
}
var person1 = createPerson("xiaohong",13,"ji");
var person2 = createPerson("xiaoming",16,"ya");
//*工廠模式的缺點是 沒有解決對象識別問題(即怎么知道一個對象的類型)
構造函數(shù)模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = New Function("alert(this.name)")
}
var person1 = new Person("xiaohong",13,"ji");
var person2 = new Person("xiaoming",16,"ya");
//用new操作符創(chuàng)建新實例.步驟有以下4點
//1)創(chuàng)建一個新對象
//2)將構造函數(shù)賦的作用域賦值給新對象(this指向新對象)
//3)執(zhí)行構造函數(shù)代碼(為新對象添加屬性)
//4)返回新對象
//構造函數(shù)與其他函數(shù)的區(qū)別是,調(diào)用它們的方法不同而已(用new調(diào)用的函數(shù)就會變成構造函數(shù))
原型模式
function Person(){ }
Person.prototype.name = "xiaohong"
Person.prototype.age = 13
Person.prototype.job = "ji"
Person.prototype.sayName = function() {
alert(this.name)
}
var person1 = new Person()
person1.sayName() //"xiaohong"
var person2 = new Person()
person2.sayName() //"xiaohong"
//*實例在沒有重寫的情況下只有其實例化對象的原型一個屬性.如下
alert(person1.name) //"xiaohong" --來自原型
person1.hasOwnProperty("name") //false
person1.name = "xiaoming"
alert(person1.name) //"xiaoming" --來自實例
person1.hasOwnProperty("name") //true
//調(diào)用構造函數(shù)時會為實例添加一個指向最初原型的指針.當原型修
//改為另一個對象時就等于切斷了構造函數(shù)與最初原型型之間的練習
//如下:
function Person(){ }
var friend = new Person()
Person.prototype = {
constructor:Person,
name : "xiaohong",
age : 13,
job : "ji",
sayName: function(){
alert(this.name)
}
}
friend.sayName() //error
//原型的缺點是共享數(shù)據(jù).當向?qū)嵗玫脑蛯傩詳?shù)組中添加元素
//會直接添加到原型從而改變所有的實例的值
//如下
function Person(){ }
Person.prototype = {
name : "xiaohong",
age : 13
friends : ["xiaoming","xiaogang"],
sayName : function () {...}
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push("daming")
alert(person1.friends) //"xiaoming,xiaogang,daming"
alert(person2.friends) //"xiaoming,xiaogang,daming"
組合使用構造函數(shù)模式和原型
//*構造函數(shù)定義實例屬性;原型定義共享方法和共享屬性
function Person(){
this.name = name
this.age = age
this.job = job
this.friends = ["daming","xiaogong"]
}
Person.prototype = {
construtor: Person,
sayName: function(){
alert(this.name)
}
}
var person1 = new Person("xiaohong",13,"ji");
var person2 = new Person("xiaoming",16,"ya");
person1.friends.push("laowang")
alert(person1.friends) // "daming,xiaogang,laowang"
alert(person2.friends) // "daming,xiaogang"
alert(person1.friends === person2.friends) // false
alert(person1.sayName === person2.sayName) // true
相關文檔
MDN ,Javascript高級程序設計