function createObj (name, age) { return { name: name, age: age } }
function Person (name, age){ this.name = name; this.age = age; }
var obj = Object.create(Person.prototype); // 建立一個對象,將這個對象的原型指向構造函數的的原型; Person.call(obj); // 執行步驟2和3, 將構造函數的this指向建立的obj對象,並運行構造函數內的代碼,爲obj對象添加屬性
function Person () {}; Person.prototype.name = 'zhanhui'; Person.prototype.job = 'programmer'; Person.prototype.sayName = function () { console.log(this.name); };
var person1 = new Person(); var person2 = new Person(); person1.name = 'wawa'; console.log(person1.name); // 'wawa'來自實例對象 console.log(person2.name); // 'zhanhui'來自原型對象
person1.age = 26; Object.defineProperty(Object.getPrototypeOf(person1), 'age', { enumerable: false }); for (var key in person1) { console.log(key); // name job sayName }
var obj = { x: 1, y: 2 }; var props = []; var i = 0; for (props[i++] in obj); props // ['x', 'y']
hasPrototypeProperty(person1, 'name'); // false person1中的name是從實例中讀取的 hasPrototypeProperty(person2, 'name'); // true person2中的name是從原型中讀取的
function Person (){} Person.prototype = { constructor: Person, // 特別指定 name: 'zhanhui', say: function() { console.log(this.name); } } // 將constructor屬性設置爲不可枚舉 Object.defineProperty(Person.prototype, 'constructor', { enumberable: false })
var boo = new Person(); boo.say() // error // 可是通過驗證並非,新的瀏覽器內核已經不存在這樣的問題了
function Person (){} Person.prototype = { constructor: Person, // 特別指定 name: 'zhanhui', say: function() { console.log(this.name); }, friends: ['boo', 'mike'] } var person1 = new Person(); var person2 = new Person(); person1.friends.push('lili'); console.log(person1.friends); // ['boo', 'mike', 'lili'] console.log(person2.friends); // ['boo', 'mike', 'lili']
function Person (name, age) { this.name = name; this.age = age; this.friends = ['boo', 'mike']; } Person.prototype = { constructor: Person, say: function () { console.log(this.name); } }
function Person (name, age) { var obj = {}; obj.name = name; obj.age = age; obj.say = function () { console.log(this.name); } return obj; } var person1 = new Person('zhanhui', 26);
function Person (name,age){ var o = {}; // 定義私有變量和方法; function howOld () { console.log(age); } // 添加共有方法,這也是閉包的應用場景,共有方法訪問私有變量 o.say = function () { console.log(this.name); }; return o; } var person1 = Person('zh', 26); // 只能經過say方法訪問私有變量name