对象的封装方法(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中,这样看来,我们就不必创建实例时,传入很多参数,那样显得代码比较繁杂。

posted on 2017-10-11 17:48  龟和兔子赛跑  阅读(171)  评论(0)    收藏  举报

导航