《JavaScript高级程序设计》(1)—&6.对象的创建及相关模式

一、对象的概念理解
先来看一个简单的对象定义代码:

var person = new Object();
person.name = "Nicholas";
person.age = 29 ;
person.job = "Software";

person.sayName = function(){
      alert(this.name);
} 

这其中创建了一个名为person的对象,并为他添加了三个属性。sayName()方法用来显示this.name。

ECMAScript中含有两种属性:数据属性和访问器属性
1.数据属性包含如下四个行为特性(具体功能不做详述)
【【Configurable】】;
【【Enumerable】】;
【【Writable】】;
【【Value】】;

2.访问器属性包含的特性
【【Configurable】】;
【【Enumerable】】;
【【Get】】;
【【Set】】;

3.多属性定义操作符Object.defineProperties()

4.读取属性特性操作符Object.getOwnPropertyDescription()

二、对象的创建
1.工厂模式

function createPerson (name, age, job ){
     var o = new Object();
     o.name = name;
     o.age = age;
     o.job = job;
     o.sayName = function (){
          alert(this.name);
          };
          return o;
 }
var person1 = createPerson("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");

工厂模式解决了ECMAScript无法创建类的问题,即用函数封装以特定接口创建对象的细节。(但无法解决对象识别问题)。

2.构造函数模式

function Person (name, age, job){
      this.name = name;
      this.age = age;
      this.job = job;
      this.sayName = function(){
          alert(this.name);
          }
}

var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Greg",27,"Doctor");

与工厂模式的区别从代码上可以很明显看出两个区别:一个是this的引用,另一个是用new Person 代替了createPerson。

总的来说就是:构造函数模式没有显示地创建对象;直接将属性和方法赋给了this对象;没有return语句。

构造函数和普通函数最显著的一个区别就是对于new操作符的调用。

构造函数的缺点:
每个方法都要在每个实例上重新创建一遍。(注意,在ECMAScript中,函数即对象),所以容易导致不同的作用域链和标识符解析。此外还有一个更大的问题,那就是在全局作用域中定义的函数实际上只能被某个对象调用,这样全局作用于将变得过于狭窄。如果对象需要定义很多方法,那么就要定义很多个全局函数,那么就会丧失应用类型的封装性。(所以才会又引出另一个模式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值