function createPerson(name,age){ var o = {}; o.name = name; o.age = age; o.sayHi = function(){ alert('my name is' + this.name); }; return o; } var p1 = createPerson('小明',10); var p2 = createPerson('小紅',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Object console.log(p2.constructor); //Object
function Person(name,age){ this.name = name; this.age = age; this.sayHi = function(){ alert('my name is' + this.name); }; } var p1 = new Person('小明',10); var p2 = new Person('小紅',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Person(name,age) console.log(p2.constructor); //Person(name,age) console.log(p1.sayHi==p2.sayHi);//false
p1的sayHi方法和p2的sayHi方法是不一樣的,說明每new一個對象就會建立一個sayHi方法,其實這徹底不必,也會浪費空間。javascript
function Person(name,age){ this.name = name; this.age = age; this.sayHi = sayHi; } function sayHi(){ alert('my name is' + this.name); } var p1 = new Person('小明',10); var p2 = new Person('小紅',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Person(name,age) console.log(p2.constructor); //Person(name,age) console.log(p1.sayHi==p2.sayHi);//true
這時它們方法所指向的代碼塊就相同,即共用了一個方法。但其實沒有必要爲了一個類的特權方法就建立一個全局的方法,也會使得這個類顯得比較凌亂。html
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.sayHi =function(){ alert('my name is' + this.name); } var p1 = new Person('小明',10); var p2 = new Person('小紅',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Person(name,age) console.log(p2.constructor); //Person(name,age) console.log(p1.sayHi==p2.sayHi);//true
對於原型鏈來建立對象,能夠看到對象引用的方法是同一個方法,即類的共有方法。這樣極大的節約了代碼空間,不會每new一個對象就就類的全部方法建立一遍。java
對於對象的特權屬性、方法和共有屬性、方法在javascript中類的屬性研究 這篇文章中有所介紹。函數