对象(二)

创建对象的方式:

1、使用原生引用类型Object()  

//使用引用Object创建  new Object()
    var obj1=new Object();
    obj1.name="obj1";
    obj1.num=1;

2、对象字面量创建

 var obj2={
        name:"obj2",
        num:2
 };

这两种方式的缺点: 当需要创建很多对象的时候,会产生大量的重复代码

3、工厂模式    用函数来封装以特定接口创建对象

function obj3(name,num){
        var b=new Object();       //显示的引用Object创建对象
        b.name=name;
        b.num=num;
        b.sayName=function(){
            alert(this.name);
        };   
        return b;                 //return 回一个对象
 }     
    var people=obj3("obj3",3);    //并未使用new   而是直接调用函数,返回一个对象

  可以无数次的调用obj3函数,每次都return 一个包含两个属性和一个方法的对象;

缺点:无法解决对象识别问题;

4、构造函数模式(创建自定义构造函数)

//构造函数模式
    function Person(name,num){
        this.name=name;
        this.num=num;
        this.sayname=function(){
            alert(this.name);
        }
    }
    var person1=new Person("obj4",4);

  与工厂模式的不同:1、没有显示的创建对象;

                                       2、直接将属性和方法赋值给this;

                                       3、没有return 语句;

实例person1保存着一个属性constructor==Person(等于构造函数),对象的constructor属性最初就是用来标识对象的;这正是构造函数模式胜过工厂模式的地方;
缺点:每个方法都要在每个实例对象上重新创建一遍;

5、原型模式:构造函数有一个prototype属性,指向原型对象,而这个原型对象包含由构造函数创建的实例共享的所有属性和方法;
所有原型对象都有一个constructor属性,指向构造函数
//原型模式
    function Person5(){};       //自定义构造函数 为空
    Person5.prototype={
constructor:Person, name:"china", num:5, sayname:function(){ alert(this.name); } }; var obj5=new Person5();

 缺点:省略了为构造函数传参,结果所有实例在默认情况下都将获得相同的属性值,对于引用类型值得属性,只要有一个实例push到一个数组中值,那么其他实例也会获得这个新值,这就是为什么不单独使用原型模式的原因;

6、构造函数和原型模式组合使用   构造函数模式用于定义实例属性;原型模式用于定义方法和共享属性;

//构造函数和原型模式组合使用
    function Person6(name,num){
       // prototype:Person.prototype;
        this.name=name;
        this.num=num;
    }
    Person6.prototype={
        constructor:Person6,
        sayname:function(){
            alert(this.name);
        }
    }
    var obj6=new Person6("obj6",6);

  

补充:

1、检测对象类型:instanceof

     实例 instancsof  构造函数     //true

2、检测实例的原型是否有某一对象

      只有实例的prototype属性指向的对象才返回true;     原型.isPrototypeOf(实例)

       Person6.prototype.isPrototypeOf(obj6)     //true

       Object.isPrototypeOf(obj6)     //false

3、Object.getPrototypeOf()     识别原型

alert(Object.getPrototypeOf(obj6)==Person6.prototype);    //true
alert(Object.getPrototypeOf(obj6)==Object);               //false

  

4、hasOwnProperty()  检测一个属性是否存在于实例中还是原型中   只有存在于对象实例才会返回true

  name必须用引号包起来,,否则为false;

obj6.name=7;
console.log(obj6.hasOwnProperty("name"));     //true  

  

5、得到所有属性无论它是否  Object.getOwnPropertyNames()

     console.log(Object.getOwnPropertyNames(obj6));
     console.log(Object.getOwnPropertyNames(Person6.prototype));

  

     



原文地址:https://www.cnblogs.com/yongyang/p/8909012.html