结合《JavaScript高级程序设计》总结下JS面向对象之构造对象

引言:

在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。而函数也是一个对象。所有对象的属性可在对象创建后动态定义早绑定(early binding)是指在实例化对象之前定义它的特性和方法,这样编译器或解释程序就能提前转换机器代码。ECMAScript不是强类型语言,所以不支持早绑定。

晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。

使用晚绑定,无需检查对象的类型,只需要检查对象是否支持特性和方法即可。ECMAScript中的所有变量都采用晚绑定方法,这样就允许执行大量的对象操作,而无任何惩罚。

构造对象的方式:

1、最普通构造对象方式:

var car=new Object;
car.color=”green”;
car.show=function (){alert(this.color)};
car.run();

2、工厂方式(工厂函数由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。)

function generateObj()
{
var obj=new Object;
obj.color=”green”;
obj.show=function (){alert(this.color)};
return obj;
}
var obj1=generateObj();
obj1.show();
var obj2=generateObj();
var obj2.show();

所有代码都包含在generateObj ()函数中,并返回obj对象作为(obj)函数值。

调用此函数时,将创建新对象,并赋予它所有必要的属性,复制出一个前面说明的obj对象。

使用该方法,可以容易地创建obj对象的两个版本(obj1和obj2),它们的属性完全一样。但是每次调用,每次调用函数generateObj (),都要创建新函数show(),意味着每个对象都有自己的show()方法,事实上,每个对象都共享了同一个函数。

优化后的工厂模式:

function generateObj(color,fn)
{
var obj=new Object
obj.color=color;
obj.show=fn;
return obj;
}
var show=function show(){alert(this.color)};

var obj1=generateObj("red",show);
obj1.show();

3、构造函数方式

var show= function(){alert(this.color);};
function GenerateObj(col){
this.color = col;
this.show =show;
}
var obj= new GenerateObj("red");
obj.show();

与工厂方式的区别在于在构造函数内部需创建对象,而是使用this关键字。

3、原型方式

function GenerateObj(){}
GenerateObj.prototype.color = "red";
GenerateObj.prototype.show = function(){alert(this.color);};
var obj = new GenerateObj();
obj.show();

该方式利用了对象的prototype属性,可把它看成创建新对象所依赖的原型。用空构造函数来设置类名,然后所有的属性和方法都被直接赋予prototype属性但是这种原型方式有一种致命的缺点,当属性指向的是对象时,对象也会被共享

function GenerateObj(){}
GenerateObj.prototype.colors = new Array("red","black");
var obj1 = new GenerateObj();
var obj2 = new GenerateObj();
obj1.colors.push("yellow");
alert(obj1.colors) //显示"red,black,yellow"
alert(obj2.colors) //显示"red,black,yellow"

4、混合型(构造函数和原型方式结合)

function GenerateObj(col){
this.color = col;
}
GenerateObj.prototype.show = function(){alert(this.color);};
var obj = new GenerateObj("red");
obj.show();

即用构造函数定义对象的所有非函数属性,用原型方式定义,对象的函数属性(方法)。

5、动态原型(结合prototype推荐)

function Car(col){
this.color = col;
if (typeof Car._initialized == "undefined"){
Car.prototype.show = function(){alert(this.color);};
Car._initialized = true;
}
}
var car = new Car("red");

其实动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置,对属性和方法进行了视觉上的封装。该方法使用标志(_initialized)来判断是否已给原型赋予了任何方法。

也许是最优方案:

functon CreatePerson(name,sex,birthday)
{
  this.name =name;
  this.sex = sex;
  this.birthday = birthday;
}
CreatePerson.prototype.sayHi = function ()
{
  alert("Hi ! I am "+this.name);
} 

var person1 = new CreatePerson(‘zs‘,‘boy‘,‘2001-02-03‘);
var person2 = new CreatePerson(‘ls‘,‘boy‘,‘2001-02-04‘);
person1.sayHi(); //outputs "Hi ! I am zs"
person2.sayHi(); //outputs "Hi ! I am ls"

一般情况下,一个对象或者类不只一个方法,需要多个方法配合使用,那么

CreatePerson.prototype={
  sayHi:function()
  {
    alert("Hi ! I am "+this.name);
  },
  walk:function()
  {
    alert("walk,walk");
  },
  ……
}
时间: 2024-08-29 07:24:22

结合《JavaScript高级程序设计》总结下JS面向对象之构造对象的相关文章

《JavaScript高级程序设计》读书笔记 ---单体内置对象

Global对象Global(全局)对象可以说是ECMAScript 中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的.ECMAScript 中的Global 对象在某种意义上是作为一个终极的“兜底儿对象”来定义的.换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法.事实上,没有全局变量或全局函数:所有在全局作用域中定义的属性和函数,都是Global 对象的属性.本书前面介绍过的那些函数,诸如isNaN().isFinite().parseInt()以及pars

读书时间《JavaScript高级程序设计》二:面向对象

接着上次的进度,开始看第6章. 第6章 面向对象的程序设计 理解对象 创建自定义对象最简单的方式就是创建一个 Object 的实例,然后为它添加属性和方法. var person = new Object(); person.name = 'xxx'; person.say = function(){ alert(this.name); } //等同于 对象字面量 var person = { name: 'xxx', say: function(){ alert(this.name); } }

JavaScript高级程序设计 第六章 面向对象程序设计

面向对象程序设计 ECMA-262将对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性和方法都有一个名字,而每个名字都映射到一个值. 6.1理解对象 创建对象的最简单方式就是创造一个Object实例,然后再为它添加属性和方法,如下所示: var person = new Object(); person.name = 'yyg'; person.age = 23; person.job = 'student; pe

JavaScript高级程序设计(五): js的关键字instanceof和typeof使用

JavaScript中instanceof和typeof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: 一.typeof 1.含义:typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function.语法为typeof(data) 或 typeof data. 我们可以使用typeof来获取一个变量是否存在,如: if(typeof a!='undefined')

《JavaScript高级程序设计第六章--面向对象》section_03

这一部分主要讲讲有关继承的问题. 6.3  继承 许多面向对象语言比如java都支持两种继承方式:接口继承(只继承方法签名)和实现继承(继承实际的方法):由于函数没有签名,在ECMAScript中只能支持实现继承.实现继承主要依靠原型链. 6.3.1 原型链 基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法. 回顾一下构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针. 所以,试想一下,我们让原型对

JavaScript高级程序设计-第六章面向对象的程序设计

创建对象主要的两种形式,创建Object实例和创建对象字面量 对象包含属性和方法 数据 .属性有四个特性,特性是为了描述属性行为的,他们是: Configurable(可配置的)是否能删除或是否能修改为访问器属性 Enumerable(枚举)是否能够for-in Writeable(可写)能否修改属性值 Value(值)默认为undefined,从这个位置上读数据或把新值保存到这个位置上 eg: var person = {}'; Object.defineproperty(person,"na

javascript 高级程序设计学习笔记(面向对象的程序设计) 2

在调用构造函数时会为实例添加一个指向最初原型的指针,我们可以随时为原型添加属性和方法,并且能在实例中体现出来,但如果是重新了原型对象,那就会切断构造函数与最初原型的联系. function Dog () { } var friend = new Dog(); Dog.prototype ={ constructor : Dog, name : "Bob", age : 11, jump : function () { alert("跳一下"); } }; frien

《JavaScript高级程序设计》读书笔记--(4)对象的创建

ECMAScript支持面向对象(OO)编程,但不使用类或者接口.对象可以在代码执行过程中创建或增强,因此具有动态性而非严格定义的实体.在没有类的情况下,可以采用下列模式创建对象. 对象的创建 工厂模式 工厂模式是软件工程里面一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.考虑到ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节,如下代码所示: function createPerson(name,age,job) { var o=new

《JAVASCRIPT高级程序设计》window/location/navigator/screen/history对象

如果要在web中使用JAVASCRIPT,那么BOM(浏览器对象模型)毫无疑问是最重要的部分.BOM提供了很多对象,例如,window.location.navigator.screen.history对象,下面我们来一一介绍这些对象的相关功能.先从window对象开始,它表示浏览器的一个实例. window对象: 一.全局作用域 window对象在ECMAScript扮演者global对象的角色,因此在全局作用域中声明的变量和函数都会成为window对象的属性和方法:但是通过这两种方式定义的属