对象的封装方法(1)
var myNew = function(constructor, args) {
var o = {};
o.__proto__ = constructor.prototype;
//只是把Person的原型对象赋值给了O的原型,但是没有继承其属性和方法
console.log(o);//Person{}
o.sayHello();//undefined
var res = constructor.apply(o, args);//o继承constructor这个构造函数的属性和方法
console.log(o);
//Person {name: "zhangHai", age: "132", sex:"男"},构造函数本身也是对象,可以被其他对象继承属性和方法
o.sayHello();//hello
console.log(o.name);//zhangHai
var type = typeof res;
if (['string', 'number', 'boolean', 'null', 'undefined'].indexOf(type) !== -1) {
return o;//o继承了Person所有的属性和方法
}
return res;
}
function Person (info){
this._init_(info);
}
Person.prototype={
constructor:Person,
_init_ : function(info) {
this.name = info.name;
this.age = info.age;
this.sex = info.sex;
},
sayHello:function(){
console.log('hello');
}
}
var o1 = myNew(Person, [{name:"zhangHai",age:"132","sex":"男"}]);//参数格式
var o2=new Person({name:"HaiLei",age:"152","sex":"nv"});
以上这种方法,看起来还是比较简洁的,将初始化工作放在了一个方法里面,以上两种方法都可以创建一个实例。把不能共用的属性或者方法可以放在info中,这样看来,我们就不必创建实例时,传入很多参数,那样显得代码比较繁杂。
浙公网安备 33010602011771号