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