var obj = { name: 'mm', age: 18, sayname: function() { console.log(this.name); } }
问题:创建多个对象时会造成代码冗余,很占内存空间。
//function createtoy(name) { // var o = new object(); // o.name = name; // o.say = function() { // console.log(this.name); // } // return o; //} function createtoy(name) { return { name: name, say: function() { console.log(this.name); } } } var toy1 = createtoy('car'); toy1.say(); var toy2 = createtoy('taxi'); toy2.say(); var toy3 = createtoy('bus'); toy3.say(); console.log(toy1 instanceof object); console.log(toy2 instanceof object); console.log(toy3 instanceof object);
问题:虽然解决了对象字面量创造对象冗余的问题,但是存在对象识别的问题,不能反映它们之间的内在关系。
function toy(name) { this.name = name; this.say = function() { console.log(this.name); } } var toy1 = new toy('car'); var toy2 = new toy('car'); console.log(toy1.constructor); console.log(toy2.constructor); console.log(toy1.say === toy2.say); // false
问题:解决了工厂模式的问题,但是相同方法重复创建就浪费了内存空间。
function person() {}; person.prototype = { constructor: person, name: 'mm', friends: ['mike','helen'], say: function() { console.log(this.name); } } var toy1 = new person('train'); var toy2 = new person('bus'); toy1.friends.push('suhai'); console.log(toy1.friends); console.log(toy2.friends);
问题:共享方法,解决了构造函数的问题。但是当前实例的引用类型的属性被所有实例共享,一个变所有变。
function person(name) { this.name = name; this.friends = ['mike','helen']; }; person.prototype = { constructor: person, say: function() { console.log(this.name); } } var toy1 = new person('train'); var toy2 = new person('bus'); toy1.friends.push('suhai'); console.log(toy1.friends); console.log(toy2.friends);
这是常用的创建方式。
通过构造函数模式定义实例属性,通过原型模式定义方法和共享的属性。
如对本文有疑问, 点击进行留言回复!!
2016年信息安全工程师综合知识第11-15题解析【建群网培信息安全工程师】
网友评论