• js高程(一)-----创建对象的几种模式


    第一种模式,工厂模式:是用函数来封装以特定接口创建对象的细节。、

    优点:解决了创建多个对象相似的问题

    缺点:没有解决对象的识别问题(即怎样知道一个对象的类型)

     1 function creatPerson(name,age,job){
     2     var o = new Object();
     3     o.name = name;
     4     o.age = age;
     5     o.job = job;
     6     o.sayName = function(){
     7       console.log(this.name);
     8     };
     9     return o;
    10   }
    11 
    12   var person1 = creatPerson("jiangjie",20,"student");
    13   var person2 = creatPerson("lukexin",20,"student");

    第二种模式,构造函数模式:

    优点:解决了工厂模式不能识别对象的问题

    缺点:每个方法都要在每个实例上重建一遍

     1 function Person(name,age,job){//构造器
     2     this.name = name;
     3     this.age = age;
     4     this.job = job;
     5     this.sayName = function(){
     6       console.log(this.name);
     7     }
     8   }
     9   var person1 = new Person('jiangjie',20,'student');
    10   var person2 = new Person('likexin',20,'student');

    第三种模式,原型模式:原型模式的知识点是最多的,通过代码先简单的介绍两个

     1 function Person(){}
     2 
     3   Person.prototype.name = "jiangjie";
     4   Person.prototype.age = 20;
     5   Person.prototype.job = "student";
     6   Person.prototype.sayName = function(){
     7     console.log(this.name);
     8   }
     9 
    10   var person1 = new Person();
    11   var person2 = new Person();
    12 
    13   person1.name = "lukexin";
    14   console.log(person1.name);//lulexin  来自实例
    15   console.log(person2.name);//jiangjie  来自原型
    16 
    17   delete person1.name;
    18   console.log(person1.name);//jiangjie 来自原型

    当需要某个属性时,搜索会从实例本身开始,如果在实例中找到了这个属性,那么搜索结束,如果没有找到,会继续搜索指针指向的原型,在原型中搜索该属性;上方代码形象的解释了这个问题;

     1 function Person(){}
     2 
     3   Person.prototype = {
     4     name:"jiangjie",
     5     age:20,
     6     job:"student",
     7     sayName:function(){
     8       console.log(this.name);
     9     }
    10   };
    11 
    12   Object.defineProperty(Person.prototype,'constructor',{
    13     enumerable:false,
    14     value:Person
    15   });
    16 
    17   var person1 = new Person();

    3到9行介绍了一种更加简单的原型语法,但是也产生了很多问题,这样的语法等于把Person.prototype设置为一个以字面量形式保存的新对象,这时他的constructor是指向了Object(这是因为用一个对象给原型赋值导致的!),如果想让constructor指向当初的构造器,就要手动改constructor属性,上方代码给出的方法是使用了object.defineProperty方法,当然还可以在字面对象中加上一条 constructor=Person解决,但是如果这样的话,会导致constructor属性的enumerable的值被设为true,也就是可以被for-in 枚举,但是通过上方的方法可以设定为不能枚举。

    第四种模式,构造函数和原型模式,也是最常见的模式,构造函数模式用于定义实例属性,原型模式用于定义方法属性,这样就可以随自己所想,设定哪些东西是共享的,那些东西是自己独立的

     1 function Person(name,age,job){
     2     this.name = name,
     3     this.age = age,
     4     this.job = job,
     5     this.friend = ["zz","xx"];
     6   }
     7 
     8   Person.prototype = {
     9     sayName : function(){
    10       console.log(this.name);
    11     }
    12   }
    13 
    14   Object.defineProperty(Person.prototype,"constructor",{
    15     enumerable:false,
    16     value:Person
    17   });
    18   
    19   var person1 = new Person('jaingjie',20,'student');
    20   var person2 = new Person('lukexin',20,'student');

    第五种模式,动态原型模式:继承了构造函数和原型模式的优点,而且写法简单

     1 function Person(name,age,job){
     2     this.name = name;
     3     this.age = age;
     4     this.job = job;
     5     if(typeof this.sayName != "function"){
     6       Person.prototype.sayName = function(){
     7         console.log(this.name);
     8       };
     9     }
    10   }
    11   
    12 var person = new Person("jiangjie",20,"student");

    第六种模式,寄生构造器模式:书中给出了需要使用这种模式的例子,首先给出这种模式的形式:

     1 function Person(name,age,job){
     2     var o = new Object();
     3     o.name = name;
     4     o.age = age;
     5     o.job = job;
     6     o.sayName = function(){
     7       console.log(this.name);
     8     };
     9     return o;
    10   }
    11 
    12   var person = new Person("jiangjie",20,"student");

    看起来非常像工厂模式,但是多了new;

    下面是使用的例子:

     1 function SpecialArray(){
     2     var values = new Array();
     3     values.push.apply(values,arguments);
     4     values.toPidString = function(){
     5       return this.join('|');
     6     };
     7     return values;
     8   }
     9 
    10   var color = new SpecialArray('red','green','gray');

    第七种模式,稳妥构造函数模式,为了防止数据被其他应用程序改动时使用,总之是为了安全吧

     1 function Person(name,age,job){
     2     var o = new Object();
     3     
     4   //在这定义私有变量或者函数
     5 
     6     o.sayName = function(){
     7       console.log(o.name);
     8     };
     9     return o;
    10   }
    11 
    12   var person = Person("jiangjie",20,"student");
  • 相关阅读:
    xhr1.0和xhr2.0的区别
    Java10-堆和栈
    Java09-函数
    Java08-函数
    java基础7-流程控制3
    Java基础-流程控制2
    Java基础—流程控制1
    breadcrumbs面包屑是啥?
    Font test 字体大小测试用JS代码实现
    数据库密码要BS64才能登录
  • 原文地址:https://www.cnblogs.com/aichihuamei/p/6597669.html
Copyright © 2020-2023  润新知