学习面向对象(二)—创建对象--Mr.Ember

学习面向对象(二)

创建对象

(1) object 构造函数或者字面量可以用来创建单个对象

(2) 工厂模式: 

          优: 解决了大量相似对象的问题

          劣: 没办法对对象进行识别
 function createPerson() {
           var o = new Object();
            o.name = name;
            o.age = age;
            o.sayName = function() {
                 alert(this.name);
            }
            return o;
 }

  var person1 = createPerson('ttw', 23);
  var person2 = createPerson('nini', 28);

 

(3) 构造函数模式:
   特: 创建一个新对象
                将构造函数的作用域赋值给新对象
                执行构造函数的代码
                 返回一个新对象
         劣: 全局作用域中定义的函数,只能被某个对象调用,这样发挥不了全局作用域的作用
function Person(name,age) {
         this.name = name;
         this.age = age;
         this.sayName = sayName
}

 function sayName() {
          alert(this.name);
}

     var person1 = new Person('ttw', 23);
     var person2 = new Person('nini', 28);

 

(4)原型模式: 
         a. 不在构造函数中定义对象实例信息,而是将这些信息全部添加到原型对象上
         b. 通过原型链访问数据
         c. 统一在原型对象上添加属性,此时constructor和原型对象的指向不一致,此时需要采用object.defineProperty来修改原型对象的指向
         d. 创建出来的实例指针指向原型,不指向构造函数。所以当创建实例后重写构造函数,此时实例创建的是原来的构造函数
          f. 由于原型中所有的属性是被实例共享的,这样对于想拥有自己特性的实例是非常不利的
function Person(name,age) {
}

Person.prototype = {
       constructor: Person,
       name: 'ttw',
       age: 23,
       friends: ['cc','yl'],
       sayName: function() {
                    alert(this.name);
                }
       }
var person1 = new Person(); var person2 = new Person(); person1.friends.puah("nini"); alert(person1.friends); //'cc','yl','nini' alert(person2.friends); //'cc','yl','nini'

 

(5) 组合构造函数模式和原型模式
        这种模式综合了构造函数的可修改单个实例属性和原型模式的构建实例共享函数的特性
 function Person(name,age) {
          this.name = name;
          this.age = age;
          this.sayName = sayName;
          this.friends = ['cc','yl'];
 }

 Person.prototype = {
          constructor: Person,
          sayName: function() {
               alert(this.name);
          }
}

 var person1 = new Person('ttw', 23);
 var person2 = new Person('nini', 28);

 person1.friends.puah("nini");

 alert(person1.friends);    //'cc','yl','nini'
 alert(person2.friends);    //'cc','yl'

 

(6) 动态原型模式
  通过动态构建原型,首次初始化时,判断是否构建了原型函数
        但是动态构建出来的原型是不能重写的,否则会发生切断实例和新原型之间的联系。参考(4)d.
function Person(name,age) {
        this.name = name;
        this.age = age;

        if(typeof this.sayName != 'function') {
                 Person.prototype.sayName = function() {
                        alert(this.name);
                 }
        }

}

var friends = new Person('ttw', 23);
friends.sayName();

 

 

posted @ 2018-10-18 17:59  Mr.Ember  阅读(121)  评论(0)    收藏  举报