javaScript 创建对象

6.创建对象

6.1 对象创建方式

6.1.1 工厂模式

       Function createPerson(name,age){

              Var  o = new Object();

              o.name = name;

              o.age = age;

              return o;

}

缺点:没有解决对象识别问题

6.1.2 构造函数模式

Function Person(name.age){

       This.name = name;

This.age = age;

This.sayName = function(){

       Alert(this.name);

}

}

Var person1 = new Person(“jim”,12);以这种方式调用构造函数会经历一下4个步骤:

1.创建一个对象

2.将构造函数的作用域赋给新对象(此时的this指向这个新对象)

3.执行构造函数中的代码(为这个新对象添加属性)

4.返回新对象

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

6.1.3 原型模式

Function Person(){

}

Person.prototype.name = “jim”;

Person.prototype.age = 12;

Person.prototype.sayName = function(){

       Alert(this.name);

}

Var person1 = new Person();

Person1.sayName();

优点:所有的属性和方法被实例共享

缺点:新对象会具有相同的属性和方法

6.1.3.1原型对象

只要创建一个新函数,该函数就会创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所以原型对象都会自动获得一个constructor属性,这个属性指向具有prototype属性的函数。当调用这个构造函数创建一个新实例后,这个实例包含一个指针[[prototype]],执行构造函数的原型对象。

原型.isPrototypeOf(实例);//返回布尔型

Object.getPrototypeOf(实例)//返回原型

每当代码读取某对象的属性时,都会执行一次搜索。搜索首先从对象实例本身开始。如果在实例中找到具有给定名字的属性,则返回该属性的值。如果没有找到,则继续搜索指针指向的原型对象。

虽然可以通过对象实例访问保存在原型中的值,但是不能通过实例重写原型中的值。

实例.hasOwnProperty(属性名);  //检测属性是存在原型还是存在实例中,当存在实例中返回true

 

6.1.3.2简化后的原型模式

Function Person(){

}

Person.prototype = {

       name : “jin”,

       age : 45,

       sayName : function(){

              alert(this.name);

}

}

Var person1 = new Person();

Person1.sayName();

此时对象字面量重写了整个原型对象,那么这个原型的constructor不在指向Person。

6.1.3.3原型的动态性

对原型的修改能够立即从实例上体现出来。但是如果对整个原型做修改,即重写原型,那情况就不一样了。例如,先创建一个实例,在重写整个原型对象,name会出错。

6.1.3.4 原生对象的原型

可以对原生对象的原型,添加方法。

6.1.4 组合使用构造函数模式和原型模式

Function Person(name,age){

       This.name = name;

This.age = age;

}

Person.prototype.sayName = function(){

       Alert(this.name);

}

6.2 定义对象属性

属性可以动态添加。对象属性分为公有的和私有的。

任何函数里面定义的变量都是私有的,外部不能访问这些变量。Js构造函数就是一个函数,因此可以在里面定义私有属性。

闭包通过自己的作用域链可以访问这些私有变量。

特权方法:有权访问私有变量和私有函数的公有方法。

1)私有属性

私有属性只能在构造函数内部定义与使用。

语法格式:var propertyName=value;

例如:function User(age){

           this.age=age;

           var isChild=age<12;

           this.isLittleChild=isChild;

    }

    var user=new User(15);

    alert(user.isLittleChild);//正确的方式

alert(user.isChild);//报错:对象不支持此属性或方法

2)公有属性

prototype方式,语法格式:functionName.prototype.propertyName=value

this方式,语法格式:this.propertyName=value,注意后面例子中this使用的位置

6.3 定义对象方法

方法可以动态添加。对象函数分为公有的和私有的。

任何函数里面定义的函数都是私有的,外部不能访问这些函数。Js构造函数就是一个函数,因此可以在里面定义私有方法。

闭包通过自己的作用域链可以访问这些私有函数。

1)  私有方法

私有方法必须在构造函数体内定义,而且只能在构造函数体内使用。

语法格式:function methodName(arg1,…,argN){ }

例如:

function User(name){

          this.name=name;

          function getNameLength(nameStr){

              return nameStr.length;

          }

          this.nameLength=getNameLength(this.name);  

    }

2)  公有方法

prototype方式,在构造函数外定义,语法格式:

functionName.prototype.methodName=method;

this方式,在构造函数内部定义,语法格式:

this.methodName=method;

例如:

function User(name){

       this.name=name;

       this.getName=function(){

               return this.name;

       };

User.prototype.getName= function(newName){

               this.name=newName;

       };

原文地址:https://www.cnblogs.com/qduanlu/p/2818113.html