14. 创建对象的多种方法及优缺点 - cw84973570/Learning-notes GitHub Wiki
https://github.com/mqyqingfeng/Blog/issues/15
工厂模式
function createPerson(name) {
var obj = new Object();
obj.name = name;
obj.sayName = function () {
console.log(this.name)
}
return obj
}
缺点:无法识别对象,方法声明多次
构造函数模式
function Person(name) {
this.name = name;
this.sayName = function () {
console.log(this.name)
}
}
缺点:方法声明多次
原型模式
function Person(name) {
}
Person.prototype = {
constructor: Person,
name: 'Kenvin',
sayName: function () {
console.log(this.name)
}
}
缺点:封装性一般,属性共享
组合模式
function Person(name) {
this.name = name;
}
Person.prototype = {
constructor: Person,
sayName: function(name) {
console.log(this.name);
}
}
缺点: 封装性一般
动态原型模式
function Person(name) {
this.name = name;
if (typeof this.sayName !== 'function') {
Person.prototype.sayName = function () {
console.log(this.syaName);
}
}
}
完美封装
下面两个模式没记住
寄生构造函数模式
function Person(name) {
var obj = new Object();
obj.name = name;
obj.sayName = function () {
console.log(this.name)
}
return obj
}
var person = new Person('Kenvin')
和工厂模式的区别是创建对象的时候多了个new,结果是一样的,可能是比较好看?按照作者的理解就是寄生在构造函数上的一种方法,返回的对象并不会是构造函数的一个对象,也就是说生成的对象实例是“寄生”在构造函数上的。
稳妥构造函数模式
function person(name) {
var obj = new Object();
obj.sayName = function() {
console.log(name);
}
return obj
}
不引用this不用new操作符创建实例,适合使用在一些安全的环境中。