• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
前端露
博客园    首页    新随笔    联系   管理    订阅  订阅

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;

       };

posted @ 2012-12-14 15:24  前端露  阅读(127)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3