构造函数的几种模式

构造函数
function Person () {
this.name = name ;
this.age = age;
this.sayName=function() {
console.log(this.name);
}
}
var man = new Person(‘mxx’, 18)
var woman = new Person(‘ali’, 26)
//具有相同的sayName方法 man和woman占用了不同的内存空间,所以浪费内存
每次new Person(),会创建一个对象,函数中的this指向改为该对象,执行函数中的代码,对象加上属性,所以每次执行一次代码函数sayName()就会再内存中储存一次
console.log(man.sayName === woman.sayName) //打印为false

1.构造函数的扩张模式
function Person () {
this.name = name ;
this.age = age;
this.sayName=sayName;
}
function sayName () {
console.log(this.name);
}
var man = new Person(‘mxx’, 18);
var woman = new Person(‘ali’, 26);
//解决了构造函数的浪费内存问题,但又有新的问题:sayName为全局对象被构造函数Person占有,如果Person需要使用很多这种函数,在全局定义很多个,就会造成全局空间污染
new 构造函创建对象,贴加的属性sayName其实是函数sayName()的映射
console.log(man.sayName === woman.sayName) //打印为true

2.寄生构造函数模式
//创建一个函数,该函数的作用仅是封装创建对象的代码,然后返回新创建的对象。
//除了使用new操作符并把使用的包装函数叫做构造函数外,这个模式跟工厂模式一摸一样。
//尽量不使用该模式
function Person(name,age) {
var o = new Object();
o.name = name;
o.age = age;
o.sayName=function() {
console.log(this.name);
}
return o;
}
var man = new Person(‘mxx’, 18);
var woman = new Person(‘ali’, 26);

//问题:1.定义了相同的方法,浪费内存空间
//2.prototype和 instanceof都没有意义
console.log(man.sayName === woman.sayName) //打印为false
console.log(man.proto === Person.prototype)//打印为false
console.log(man instanceof Person)//打印为false

3.稳妥构造函数模式
//没有公共属性,而且它的方法也不引用this对象
function Person(name) {
var o = new Object();
//name就属于私有属性
o.say = function () {
console.log(name); //注意:不使用this,而使用参数传入的变量
}
return o;
}
//p1对象叫稳妥对象
var p1 = new Person(‘mxx’);
p1.sayName();

猜你喜欢

转载自blog.csdn.net/qq_52317104/article/details/120538379