您的位置:首页 > Web前端 > JavaScript

【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 6 面向对象编程

2015-08-18 22:26 543 查看

1. 对象

1.1 构造函数

new 关键字提供了一种简便的新对象创建方式。如果调用函数时在前面加上 new 修饰符,其 this 变量将指向一个新对象,该对象会自动返回(除非显式使用 return 语句返回特定值)。以这种方式创建对象的函数称为构造函数。以下是创建兔子对象的构造函数。

function Rabbit(adjective){
this.adjective = adjective;
this.speak = function(line){
print("The ", this.adjective, " rabbit says '", line, "'");
};
}

//try
var killerRabbit = new Rabbit("killer");
killerRabbit.speak("GRAAAAAAAAAAAAAAAH!");


1.2 从原型中构建

为何必须使用 new 关键字?毕竟,我们也可以这样编写:

function makeRabbit(adjective){
return{
adjective: adjective;
speak:function(line);
};
}

//try
var blackRabbit = makeRabbit("black");


但是两者并不完全相同。首先,killerRabbit 有一个 constructor 属性,指向创建该属性的 Rabbit 函数。blackRabbit 也由一个这样的属性,但它指向 Object 函数。

rabbit对象基于与 Rabbit 构造函数相关的原型。可以使用构造函数的 prototype 属性访问该原型。

注意:对象可以共享其原型的属性,但这种共享是单向的(类似于 C++ 中的继承)。原型的属性影响对象,但是改变对象却永远不会影响到原型。

规则:查询一个属性值的时候,JavaScript 首先查询该对象自身的所有属性,如果有查找到属性的名称,该属性就是要查找的值;如果没有,就继续查找该对象原型,然后是原型的原型,依次类推。如果最后么有找到,则返回 undefined 值。

下面是构造函数的一个新方法:(建议以后用这种方式定义对象)

function Rabbit(adjective){
this.adjective = adjective;
}
Rabbit.prototype.speak = function(line){//在原型的基础上添加方法
print("The ", this.adjective, " rabbit says '", line, " '");
}


1.3 原型污染问题

JavaScript 中对象扮演者两种角色:拥有方法的值,原型对其来说是有利的;属性集,原型对其只有阻碍作用。所有对象都有原型,并从该原型上获得一些属性,这意味着,让我们想对对象遍历了解其属性时需要判断属性是属于对象自身还是属于原型,否则则会出错,这种情况也叫 原型污染

如何判断属性是否属于对象自身还是属于原型呢?

针对这个问题可以有两种方法判断:

a. hasOwnProperty 方法,是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员,返回一个bool值。

b. propertyIsEnumerable 方法,一个对象是否可以进行for in穷举,我们可以通过propertyIsEnumerable属性来判断,说明如下:  propertyIsEnumerable 属性,返回 Boolean 值,指出所指定的属性是否为一个对象的一部分以及该属性是否是可列举的。

进一步,可以针对这种问题编写一个构造函数并指定原型,以便将对象视为属性集进行获取。即 Dictionary 。(具体参考JavaScript编程精解 page.80)

2.构建生态系统模拟

目的:建立一个虚拟生态圈,包括一个池塘和里面游动的生物,我们建立对象来模拟生态圈和里面的生物,并为这些对象编写一些方法让生物具有“生机”,使它们有自己的生活方式。

2.1 定义生态圈

定义生态圈为一个 plan 字符串数组:

var thePlan =
["###############################",
"#      #     #      o        ##",
"#                             #",
"#           #####             #",
"##          #   #      ##     #",
"###            ##       #     #",
"#            ###        #     #",
"#     ####                    #",
"#     ##         o            #",
"#  o   #            o    ###  #",
"#      #                      #",
"###############################"]


其中 # 字符代表生态圈的墙壁(和生态圈李的岩石),o 字符代表昆虫,空格就是空的地方。

2.2 空间里的点

3. 更逼真的模拟生态系统

4. 原型继承

继承:新对象建立在旧对象的基础上,节约了重新编写这些方法的时间,这种技术称为继承。本质上来讲,继承归根结底只是一种使程序员可以偷懒的技巧。继承是创建新类型对象——子类型(subtype),子类型基于父类型(supertype)。子类型拥有父类型所有的属性和方法(从父类型继承得到),然后修改其中的部分内容或者添加新的内容,继承最好在子类型模型可以被视为父类型对象的时候使用。

注意:javascript 中没有直接继承的函数或方法,网上搜索关键词:javascript 和继承,会看到很多不同的版本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: