《JavaScript高级程序设计》(1)—&6.对象的创建及相关模式
2015-12-22 23:20
691 查看
一、对象的概念理解
先来看一个简单的对象定义代码:
这其中创建了一个名为person的对象,并为他添加了三个属性。sayName()方法用来显示this.name。
ECMAScript中含有两种属性:数据属性和访问器属性
1.数据属性包含如下四个行为特性(具体功能不做详述)
【【Configurable】】;
【【Enumerable】】;
【【Writable】】;
【【Value】】;
2.访问器属性包含的特性
【【Configurable】】;
【【Enumerable】】;
【【Get】】;
【【Set】】;
3.多属性定义操作符Object.defineProperties()
4.读取属性特性操作符Object.getOwnPropertyDescription()
二、对象的创建
1.工厂模式
工厂模式解决了ECMAScript无法创建类的问题,即用函数封装以特定接口创建对象的细节。(但无法解决对象识别问题)。
2.构造函数模式
与工厂模式的区别从代码上可以很明显看出两个区别:一个是this的引用,另一个是用new Person 代替了createPerson。
总的来说就是:构造函数模式没有显示地创建对象;直接将属性和方法赋给了this对象;没有return语句。
构造函数和普通函数最显著的一个区别就是对于new操作符的调用。
构造函数的缺点:
每个方法都要在每个实例上重新创建一遍。(注意,在ECMAScript中,函数即对象),所以容易导致不同的作用域链和标识符解析。此外还有一个更大的问题,那就是在全局作用域中定义的函数实际上只能被某个对象调用,这样全局作用于将变得过于狭窄。如果对象需要定义很多方法,那么就要定义很多个全局函数,那么就会丧失应用类型的封装性。(所以才会又引出另一个模式)
先来看一个简单的对象定义代码:
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中,函数即对象),所以容易导致不同的作用域链和标识符解析。此外还有一个更大的问题,那就是在全局作用域中定义的函数实际上只能被某个对象调用,这样全局作用于将变得过于狭窄。如果对象需要定义很多方法,那么就要定义很多个全局函数,那么就会丧失应用类型的封装性。(所以才会又引出另一个模式)
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享
- 如何创建对象以及jQuery中创建对象的方式
- IE8开发人员工具教程(二)
- Mootools 1.2教程 函数