JavaScript 学习笔记 - 对象和继承

本文是JavaScript The Good Part 有关对象和继承的学习笔记。

1. Object.create

本函数是ECMAScript 5中的标准函数,其作用是用一个对象作为原型来生成另一个对象,可以用以下的code 模拟实现。

    if(typeof Object.create !== ‘function‘) {
        Object.create = function(proto){
            var F = function(){};
            if(typeof proto !== ‘object‘){
                //Follow the chrome error pattern.
                throw new TypeError(‘Object prototype may only be an Object or null: ‘ + proto);
            }
            F.prototype = proto;
            return new F();
        };
    }

  

具体的想法就是利用一个内部的函数作为委托,将所需的新对象和原来的对象隔离开来。

关于出错处理是根据Chrome现在的错误信息生成的。

2. new

new 是JavaScript里面的一个关键字,其具体的作用,请参考 MDN。 可以用以下的Code进行模拟。

    _new = function(constructor, args){
        var that = Object.create(constructor.prototype),
            other = constructor.apply(that, args);
        return (typeof(other) === ‘object‘ && other) || that;
    }

3. 继承

3.1 伪传统方式 (Pseudoclassical)

书中并没有推荐这种模拟传统继承的方式。因为它偏离了JavaScript原型继承的特性。

3.2 原型(Prototypal)

其示例代码如下所示。

var myMammal = {
    name : ‘Herb the Mammal‘,
    get_name : function ( ) {
    return this.name;
    },
    says : function ( ) {
    return this.saying || ‘‘;
    }
};

var myCat = Object.create(myMammal);
myCat.name = ‘Henrietta‘;
myCat.saying = ‘meow‘;
myCat.purr = function (n) {
    var i, s = ‘‘;
    for (i = 0; i < n; i += 1) {
        if (s) {
            s += ‘-‘;
        }
        s += ‘r‘;
    }
    return s;
};
myCat.get_name = function ( ) {
    return this.says( ) + ‘ ‘ + this.name + ‘ ‘ + this.says( );
};

子类不会拥有父类构造函数中的属性和方法,不过没有对类型中的私有变量进行保护。

3.3 函数(Functional)

var constructor = function (spec, my) {
  var that, other private instance variables;
  my = my || {};
  Add shared variables and functions to my
  that = a new object;
  Add privileged methods to that
  return that;
};

加粗的地方需要替换成实际的代码。

需要说明的地方如下。

  • spec是构造对象所需的信息。
  • my是构造函数可以分享给其他对象的信息,不是必需的。
  • 构造一个对象(a new object)可以是字面量,使用new构造,使用Object.create,调用其他返回对象的函数。
  • 函数内部的私有属性是外部不能看到的。
  • 添加私有函数的方法如下所示。
var methodical = function ( ) {
    ...
};
that.methodical = methodical;

例如我们在调用methodical的时候,就直接使用内部的methodical,而不使用that.methodical,这样可以防止此函数被篡改掉。

书中的例子如下。

vvar mammal = function (spec) {
    var that = {};
    that.get_name = function ( ) {
        return spec.name;
    };
    that.says = function ( ) {
        return spec.saying || ‘‘;
    };
    return that;
};
var myMammal = mammal({name: ‘Herb‘});
    var cat = function (spec) {
    spec.saying = spec.saying || ‘meow‘;
    var that = mammal(spec);
    that.purr = function (n) {
        var i, s = ‘‘;
        for (i = 0; i < n; i += 1) {
            if (s) {
                s += ‘-‘;
            }
            s += ‘r‘;
        }
        return s;
    };
    that.get_name = function ( ) {
        return that.says( ) + ‘ ‘ + spec.name + ‘ ‘ + that.says( );
    }
    return that;
};
var myCat = cat({name: ‘Henrietta‘});
时间: 2024-10-21 20:46:12

JavaScript 学习笔记 - 对象和继承的相关文章

JavaScript学习笔记——对象知识点

javascript对象的遍历.内存分布和封装特性 一.javascript对象遍历 1.javascript属性访问 对象.属性 对象[属性] //字符串格式 2.javascript属性遍历 for in 二.内存分布 三.对象的特性之封装 把对象所有的组成部分组合起来,尽可能的隐藏对象的部分细节,使其受到保护. 只保留有限的接口和外部发生联系. 一.工厂函数 二.构造函数 三.prototype方法 四.混合方法

JavaScript学习笔记——对象基础

javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研究的任何事物,不仅能表示具体事物,还能表示抽象的规则,计划或事件. 属性的无序集合,每个属性可以存一个值(原始值,对象,函数) B.对象的属性和行为 属性:用数据值来描述他的状态 行为:用来改变对象行为的方法 C.类 具有相同或相似的性质的对象的抽象就是类.对象的抽象,就是类,类的具体化(实例化)

JavaScript学习笔记——对象分类

对象的分类和内置Math对象 一.对象的分类 1.内置对象 Global Math 2.本地对象 Array Number String Boolean Function RegExp 3.宿主对象 DOM BOM 二.Math对象 格式: Math.方法(参数) 1.取绝对值 Math.abs(); 2.取近似整数 //Math.round() 四舍五入 //Math.floor() 对数进行下取舍 //Math.ceil() 对数进行上取舍 3.取最大值或最小值 Math.max(参数...

javascript学习笔记-对象

原文地址:http://blog.51cto.com/hudamao/2115725

javascript学习笔记---ECMAScriptECMAScript 对象----修改对象

通过使用 ECMAScript,不仅可以创建对象,还可以修改已有对象的行为. prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法. 创建新方法 通过已有的方法创建新方法Number.prototype.toHexString = function() { return this.toString(16); }; 在此环境中,关键字 this 指向 Number 的实例,因此可完全访问 Number 的所有方法.有了这段代码,可实现下面的操作: var iNu

JavaScript学习笔记【2】表达式和运算符、语句、对象

笔记来自<JavaScript权威指南(第六版)> 包含的内容: 表达式和运算符 语句 对象 表达式和运算符 数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充值undefined.元素列表末尾可以留下单个逗号,这时并不会创建一个新的值为undefined元素. 属性访问表达式,.identifier的写法只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性的名字.如果属性名称是一个保留字或者包含空格和标识符,或是一个数字(对于数组来说),则必须使用方括号的写法.当属性

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

javascript学习笔记---ECMAScript语法(引用类型)

引用类型通常叫做类(class). 本教程会讨论大量的 ECMAScript 预定义引用类型. 引用类型 引用类型通常叫做类(class),也就是说,遇到引用值,所处理的就是对象. 本教程会讨论大量的 ECMAScript 预定义引用类型. 从现在起,将重点讨论与已经讨论过的原始类型紧密相关的引用类型. 注意:从传统意义上来说,ECMAScript 并不真正具有类.事实上,除了说明不存在类,在 ECMA-262 中根本没有出现"类"这个词.ECMAScript 定义了"对象定

JavaScript学习笔记【3】数组、函数、服务器端JavaScript概述

笔记来自<JavaScript权威指南(第六版)> 包含的内容: 数组 函数 服务器端JavaScript概述 数组 数组是动态的:根据需要它们会增长或缩减,并且在创建数组时无须声明一个固定的大小或在数组大小变化时无须重新分配空间. 数组可能是稀疏的:索引不一定要连续的,它们之间可以有空缺. 通常,数组的实现是经过优化的,用数字索引来访问数组元素一般来说比访问常规的对象属性要快很多. 数组继承自Array.prototype中的属性,它定义了一套丰富的数组操作方法. 如果省略数组直接量中的某个