搞“对象”从来都不简单

2019-01-03  本文已影响0人  达摩会武术
1-- 首先对象的两种创建模式,这个两种哈,一种字面量,一种new obj,打死你你也不能忘,要不然单身一辈子。
第一种:
   var qi=new Object();
第二种:
  var qi1={}....
2-- 对象的创建分为很多种模式,正如找对象的方法有很一样。
3-- 工厂模式: 可以无数次的调用这个函数,每次返回一个包含这4个属性的对象。 工厂模式解决了多个相似对象的问题,但是却没有解决对象识别的问题(即怎样知道一个对象的类型,例如Array,Date等等)。
工厂模式:
 function createObject(name,love,age,words){
    var o = new Object();
    o.name=name;
    o.age=age;
    o.love=love;
    o.words=words;
    o.say=function(){
      console.log(this.words);
}
}
4-- 构造函数模式:可以用来创建特定类型的对象。
构造函数模式:
 function createObject1(name,love,age,words){
    this.name=name;
    this.age=age;
    this.love=love;
    this.words=words;
    this.say=function(){
      console.log(this.words);
}
}

构造函数的创建新对象的过程:创建一个新对象 => 将构造函数的作用于给新对象(因此this就指向了这个新对象) => 执行构造函数中的代码(为这个新对象添加属性) => 返回这个新对象。

构造函数的问题: 每个方法都要在每个实例上重新创建一遍。

5--原型模式:原型模式的好处就是让所有对象实例共享他所包含的属性和方法--share~︿( ̄︶ ̄)︿!
原型模式:
 function Co2(){
};
  Co2.prototype.name="gg";
  Co2.prototype.love="basketball";
  Co2.prototype.age=27;
  Co2.prototype.words="life is beautiful~!"
  var G1=new Co2();

原型对象的理解:只要创建了一个函数,就会有一个prototype的属性指向这个函数的原型对象。 所有的原型对象都有一个constructor属性---是一个指向prototype所在的那个函数的指针。
实例中创建的和原型中同名的属性,实例的属性会将原型中的同名属性屏蔽掉。

5-1引申!!重写对象的原型:需要注意的是重写整个原型和在原型上添加方法是不一样的!
原型被字面量对象重写:
    function Co3(){};
    Co3.prototype={
      name : "gg",
      love : "basketball",
      age : 27,
      words : "life is beautiful~!"
};
    var G2=new Co3();

上面的代码中我们将函数Co3的原型用字面量对象重写了,结果和上面的原型模式相同,但是constructor的指向不再是Co3,而是object,因为原型对象是通过字面量对象进行重写的;字面量对象哪来的,object造出来的呗,所以重写后的constructor被修改指向了object对象。

6-- 构造函数和原型的组合模式:构造函数用来定义实例属性,而原型用来定义共享的方法和属性。
构造函数和原型组合模式:
    function Co4(name,love,age){
      this. name=name;
      this.love=love;
      this.age=age; 
};
    Co4.prototype={
     constructor : Co4,  
      saywords : "life is beautiful~!"
};
    var G2=new Co4("kirk","sprots",27);
7-- 动态原型模式:通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。
        function Person(name, age, job){
        
            //properties
            this.name = name;
            this.age = age;
            this.job = job;
            
            //methods方法
            if (typeof this.sayName != "function"){
            
                Person.prototype.sayName = function(){
                    alert(this.name);
                };
                
            }
        }

        var friend = new Person("Nicholas", 29, "Software Engineer");
        friend.sayName();

只有在sayname方法不存在得情况下,才会将他添加到原型中。这里对于原型的修改可以立即在所有实例中得到反映。

上一篇 下一篇

猜你喜欢

热点阅读