`

《王者归来》读书笔记 ── JavaScript 面向对象编程(1)

阅读更多

跳过 JS 核心(语言结构、数据类型、函数、对象、集合、字符串等)以及 BOM、DOM 部分,这个系列的笔记主要总结一下《王者归来》面向对象编程部分的知识点,以便梳理和查阅。

JavaScript 究竟是不是一种面向对象的语言呢?

“面向对象不是只有类模型一种,prototype-based(基于原型)是 class-based(基于类)的简化版,是一种 class-less 的面向对象。对应的,prototype 继承是 class 继承的简化版(例如省略了多重继承、基类构造函数、忽略了引用属性的继承等),但不能因为它不支持这些特性就不承认它是一种完整的继承。是否为继承添加额外的特性,开发者可以自由选择,但在不需要这些额外特性的时候,还是有理由尽量用 prototype-based 继承。

总而言之,prototype-based 认为语言本身可能不需要过分多的 reuse 能力,它牺牲了一些特性来保持语言的简洁,这没有错,prototype-based 虽然比 class-based 简单,但它依然是真正意义上的 object-oriented。”


I. 公有和私有 ── 属性的封装

JS中,函数是绝对的“第一型”,JS 的对象和闭包都是通过函数实现的。利用闭包的概念,JS 中可以有不逊色于其他各种面向对象语言的公有和私有特性:

function List(){
    var m_elements = [];   //私有成员,对象外无法访问
    m_elements = Array.apply(m_elements, arguments);

    //公有属性,可以通过“.”运算符或下标访问
    this.length = {
        valueOf : function(){return m_elements.length;},
       toString : function(){return m_elements.length;}
    }

    this.toString = function(){
        return m_elements.toString();
    }

    this.add = function(){
        m_elements.push.apply(m_elements, arguments);
    }
}

这个例子中 this.length, this.toString, this.add 是公有成员,其中 this.length 是私有成员 m_elements 的 length 属性的 getter,外部我们可以通过“.”运算符对这些属性进行访问。

对象的 getter 是一种特殊的属性,它形式上像是变量或者对象属性,但它的值随着传入参数的改变而改变。在不支持 getter 的语言中,我们通常用 get<Name> 方法来替代,其中 <Name> 是 getter 的实际名字,其效果与 getter 等价。ECMAScript v3 不支持 getter,但可以用上面这种构造带有 valueOf 和 toString 方法的对象来模拟 getter。

对象的 setter 是另一个相对应的属性,它的作用是通过类似赋值的方式改变对象的某些参数或者状态,遗憾的是,ECMAScript v3 不支持 setter,并且目前为止也没什么好的方法可以在 JS 中模拟 setter。要实现,只有通过定义 set<Name> 方法来实现:(


II. 属性和方法的类型

在 JS 里,对象的属性和方法支持 4 种不同的类型,下面通过一个例子来说明:

function myClass(){
    var p = 100;  //private property; 1. 私有属性
    this.x = 10;  //dynamic public property 2. 动态公有属性
}

myClass.prototype.y = 20;  //static public property or prototype property 3. 静态公有属性或称原型属性

myClass.z = 30;  //static property 4. 静态属性或称类属性

下面说下他们的特点和区别:

1. 私有属性上面已经提到,它的特点是对外界不开放,只能通过特定的 getter 和 setter 访问。实例化 myClass() 后,如果通过“.”运算符直接访问 p 会得到 undefined;

2. 动态公有属性的特点是外界可以访问,而且每一个对象实例持有一个副本,他们之间不会相互影响;

3. 原型属性的特点是每个对象实例共享唯一副本,对它的改写会相互影响;

4. 类属性的特点是作为类型的属性而不是对象实例的属性,也就是说不能通过对象实例的“.”运算符访问,那样会得到 undefined。上例中通过 myClass.z 直接访问即可。

有关 prototype 的知识点要放到下几篇,毕竟是 JS 面向对象编程的重点所在,内容比较多。简单预告一下第 2 篇笔记,包括 prototype 的使用技巧、实质及其范例。之后几篇会涉及继承和多态、构造和析构、包装对象、元类,类模板等。

本篇结尾以一个例子简述一下 prototype,“prototype 是在 IE 4 及其以后版本引入的一个针对于某一类的对象的方法,而且特殊点在于:它是一个给类的对象添加方法的方法”:

为本地对象 Number 添加数字阶乘方法:Number.fact()

实现:

Number.prototype.fact = function(){
    var num = Math.floor(this);
    if(num<0) return NaN;
    else if(num==0 || num==1) return 1;
    else return (num*(num-1).fact());
}

alert((10).fact());  //3628800

分享到:
评论

相关推荐

    javascript王者归来-中文清晰版

    《JavaScript王者归来》是一本备受推崇的编程指南,专注于JavaScript这一强大的编程语言。该书以中文清晰版的形式呈现,确保了国内读者能够无障碍地学习和理解JavaScript的核心概念和技术。作者深入浅出地讲解了...

    JavaScript王者归来 源代码

    javascript王者归来的源代码。/* Simple Menu Code By Lee. 这只是一个用来示范的例子,其中的内容可能超过了读到这个章节的读者能够理解的范围,但是没有关系,你可以先跳过这些具体的内容,继续往下看 */

    JavaScript王者归来之源代码

    《JavaScript 王者归来》是一本专注于深入探讨JavaScript编程技术的书籍,其源代码提供了丰富的实例和练习,旨在帮助读者提升对JavaScript的理解并掌握实际应用。这份源代码包含了一系列与书中内容紧密相关的脚本,...

    JavaScript王者归来PDF本下载.txt

    根据提供的文件信息,我们可以推断出这是一份关于“JavaScript王者归来”的电子书籍资源分享链接。尽管实际内容并未给出,但结合标题、描述以及部分可见的内容,我们可以围绕这本书的主题——JavaScript,来展开一...

    javascript 王者归来.pdf

    《JavaScript王者归来》这本书深入探讨了这种语言的核心概念和高级特性,旨在帮助读者掌握JavaScript编程的精髓,理解其背后的原理。 一、基础篇:JavaScript语言核心 1. 变量与数据类型:JavaScript支持动态类型,...

    王者归来之Thinking in java读书笔记

    通过阅读《王者归来之Thinking in Java读书笔记》,你可以系统地掌握Java编程的核心知识,理解编程思想,提高解决问题的能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。这本书不仅提供了理论知识,还有...

    javascript王者归来.rarjavascript王者归来.rar 2

    【标题】:“javascript王者归来”指的是JavaScript这门编程语言在Web开发领域的强势地位和广泛应用。JavaScript,常简称为JS,是一种轻量级的解释型编程语言,主要用于客户端的网页交互和服务器端的数据处理。它在...

    [JavaScript王者归来].月影.扫描版 02

    JavaScript王者归来

    JavaScript王者归来(完整+书签).part1

    JavaScript王者归来(完整+书签).part1

    javascript王者归来完整pdf版_1/2

    javascript王者归来完整版第一部分(共两部分)

    JavaScript王者归来

    JavaScript王者归来 月影 高清晰

    javascript 王者归来,源码,写的通俗易懂,很有代表性。值得学习

    这份"javascript 王者归来"的源码库,很可能包含了各种JavaScript的实用技巧、设计模式以及面向对象编程的思想,这些都是成为JavaScript高手的必备知识。 在JavaScript的世界里,函数是第一公民,闭包、原型链、...

    javascript王者归来源码

    JavaScript王者归来,这是一个聚焦于JavaScript编程的资源集合,包含了丰富的源码示例,旨在帮助开发者深入理解和掌握这门强大的脚本语言。以下是基于这些资源的关键知识点的详细解析: 1. **JavaScript基础** - ...

    JavaScript王者归来PDF----分卷5

    JavaScript王者归来PDF 一本非常好的JavaScript学习资源.. 共分了5个分卷,这里是第5分卷

    《JavaScript王者归来》光盘源代码

    《JavaScript王者归来》是一部深入探讨JavaScript编程语言的权威著作,其光盘源代码包含了丰富的示例、练习和项目,旨在帮助读者深入理解并熟练掌握JavaScript的核心概念和技术。这本书的源代码资源是学习JavaScript...

    JavaScript王者归来源码

    JavaScript王者归来,这是一个聚焦于JavaScript编程语言的深度学习资源,旨在帮助开发者提升其在JavaScript领域的专业技能,从而达到“王者归来”的境界。源码通常指的是实际的编程代码,这意味着这个压缩包可能包含...

    javaScript王者归来完整源代码

    "JavaScript王者归来完整源代码"是一个全面的学习资源,旨在帮助开发者深入理解并掌握这门语言,从而提升他们的编程技能。这份源代码包含了一系列实例和深度解析,适合初学者和有经验的开发者。 首先,我们要明白...

Global site tag (gtag.js) - Google Analytics