2.JavaScript中的原型规则以及原型设计模式

  • 原型规则

    1. 原型规则
      • 所有的引用类型(数组、对象、函数),都具有对象特征,即可自由扩展属性;
      • 所有的引用类型,都有一个_proto_ 属性(隐式原型),属性值是一个普通对象;
      • 所有函数,都具有一个prototype(显示原型),属性值也是一个普通原型;
      • 所有的引用类型(数组、对象、函数),其隐式原型指向其构造函数的显式原型;(obj.proto === Object.prototype);
      • 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)中去寻找;
    1. 原型对象:prototype 在js中,函数对象其中一个属性:原型对象prototype。普通对象没有prototype属性,但有_proto_属性。 原型的作用就是给这个类的每一个对象都添加一个统一的方法,在原型中定义的方法和属性都是被所以实例对象所共享。
      1 var person = function(name){
      2     this.name = name
      3 };
      4 person.prototype.getName=function(){//通过person.prototype设置函数对象属性
      5     return this.name; 
      6 }
      7 var crazy= new person(‘crazyLee’);
      8 crazy.getName(); //crazyLee//crazy继承上属性
    2. 原型链  当试图得到一个对象f的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)obj._proto_中去寻找;当obj._proto也没有时,便会在obj._proto.proto(即obj的构造函数的prototype的构造函数的prototype)中寻找;
  • 设计模式

    • 工厂模式

 

             在函数内创建一个对象,给对象赋予属性及方法再将对象返回

 1 function Person() {
 2     var People = new Object();
 3     People.name = 'CrazyLee';
 4     People.age = '25';
 5     People.sex = function(){
 6         return 'boy';
 7     };
 8     return People;
 9 }
10  
11 var a = Person();
12 console.log(a.name);//CrazyLee
13 console.log(a.sex());//boy
  1. 构造函数模式

       无需在函数内部重新创建对象,而是用this指代

 1 function Person() {
 2     this.name = 'CrazyLee';
 3     this.age = '25';
 4     this.sex = function(){
 5         return 'boy'
 6     };
 7     
 8 }
 9  
10 var a = new Person();
11 console.log(a.name);//CrazyLee
12 console.log(a.sex());//boy
  1. 原型模式

             函数中不对属性进行定义,利用prototype属性对属性进行定义,可以让所有对象实例共享它所包含的属性及方法。

function Parent() {
    Parent.prototype.name = 'carzy';
    Parent.prototype.age = '24';
    Parent.prototype.sex = function() {
        var s="女";
             console.log(s);
    }
}
 
var  x =new  Parent();  
console.log(x.name);      //crazy
console.log(x.sex());       //
  1. 混合模式

            原型模式+构造函数模式。这种模式中,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性

 1 function Parent(){  
 2     this.name="CrazyLee";  
 3     this.age=24;  
 4 };
 5 Parent.prototype.sayname=function(){  
 6     return this.name;  
 7 };
 8  
 9 var x =new Parent(); 
10 console.log(x.sayname());   //Crazy
  1. 动态原型模式

         将所有信息封装在了构造函数中,而通过构造函数中初始化原型,这个可以通过判断该方法是否有效而选择是否需要初始化原型。

 1 function Parent(){  
 2     this.name="CrazyLee";  
 3     this.age=24;  
 4     if(typeof Parent._sayname=="undefined"){     
 5         Parent.prototype.sayname=function(){  
 6             return this.name;  
 7         }  
 8         Parent._sayname=true;  
 9     }         
10 };   
11  
12 var x =new Parent();  
13 console.log(x.sayname()); 

 

posted @ 2019-11-11 16:41  小乐9924  阅读(280)  评论(0编辑  收藏  举报
小乐9924