javascript中有原型对象和实例对象

如有疑问请参考:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

下面的代码可以用Rhino解释,代码如下:

/**
* Cat的对象
* name、color;猫科动物,吃老鼠
*/

print("--- --- --- 生成对象的原始模式 --- ---");
/*var Cat = {
    name : '',
    color : ''
};*/

var cat1 = {};
    cat1.name = "mao1";
    cat1.colr = "orange";

print("cat1 : name=" + cat1.name + ", color=" + cat1.colr);

print();
print("--- --- --- 原始模式的改进 --- ---");

function Cat1(name,color){
    return {
        name:name,
        color:color
    };
};

var cat2 = Cat1("mao2", "yellow");
print("cat2 : name=" + cat2.name + ", color=" + cat2.color);

print();
print("--- --- --- 构造函数模式 --- ---");

function Cat2(name, color){
    this.name = name;
    this.color = color;
}

var cat3 = new Cat2("mao3", "blue");
print("cat3 : name=" + cat3.name + ", color=" + cat3.color);
print("cat3.constructor == Cat2 --- " + (cat3.constructor == Cat2));
print("cat3 instanceof Cat2 --- --- " + (cat3 instanceof Cat2));

print();
print("--- --- --- 构造函数模式的问题 --- ---");

function Cat3(name, color){
    this.name = name;
    this.color = color;
    this.type = "猫科动物";
    this.eat = function(){
        print("吃老鼠");
    };
}

var cat4 = new Cat3("mao4", "red");
var cat5 = new Cat3("mao5", "pink");
print("cat4 : name=" + cat4.name + ", color=" + cat4.color + ", type=" + cat4.type);
cat4.eat();
print("cat5 : name=" + cat5.name + ", color=" + cat5.color + ", type=" + cat5.type);
cat5.eat();

print("cat4.type == cat5.type --- --- " + (cat4.type == cat5.type));
print("cat4.eat == cat5.eat() --- --- " + (cat4.eat == cat5.eat));

print();
print("--- --- --- Prototype模式 --- ---");

function Cat4(name,color){
    this.name = name;
    this.color = color;
}
Cat4.prototype.type = "猫科动物";
Cat4.prototype.eat = function(){
    print("吃老鼠");
};

var cat6 = new Cat4("mao6", "green");
var cat7 = new Cat4("mao7", "gray");
print("cat6 : name=" + cat6.name + ", color=" + cat6.color + ", type=" + cat6.type);
cat6.eat();
print("cat7 : name=" + cat7.name + ", color=" + cat7.color + ", type=" + cat7.type);
cat7.eat();

print("cat6.type == cat7.type --- --- " + (cat6.type == cat7.type));
print("cat6.eat == cat7.eat --- --- - " + (cat6.eat == cat7.eat));

print();
print("--- --- --- Prototype模式的验证方法 --- ---");

print("Cat4.prototype.isPrototypeOf(cat6) --- " + Cat4.prototype.isPrototypeOf(cat6));
print("Cat4.prototype.isPrototypeOf(cat5) --- " + Cat4.prototype.isPrototypeOf(cat5));

print('cat6.hasOwnProperty("name") --- --- ' + cat6.hasOwnProperty("name"));
print('cat6.hasOwnProperty("type") --- --- ' + cat6.hasOwnProperty("type"));

print('"name" in cat7 --- ---' + ("name" in cat7));
print('"colr" in cat7 --- ---' + ("colr" in cat7));
for(var prop in cat7) {
    print("\tcat7["+prop+"] = " + cat7[prop]);
} 

打印结果如下:

--- --- --- 生成对象的原始模式 --- ---
cat1 : name=mao1, color=orange

--- --- --- 原始模式的改进 --- ---
cat2 : name=mao2, color=yellow

--- --- --- 构造函数模式 --- ---
cat3 : name=mao3, color=blue
cat3.constructor == Cat2 --- true
cat3 instanceof Cat2 --- --- true

--- --- --- 构造函数模式的问题 --- ---
cat4 : name=mao4, color=red, type=猫科动物
吃老鼠
cat5 : name=mao5, color=pink, type=猫科动物
吃老鼠
cat4.type == cat5.type --- --- true
cat4.eat == cat5.eat() --- --- false

--- --- --- Prototype模式 --- ---
cat6 : name=mao6, color=green, type=猫科动物
吃老鼠
cat7 : name=mao7, color=gray, type=猫科动物
吃老鼠
cat6.type == cat7.type --- --- true
cat6.eat == cat7.eat --- --- - true

--- --- --- Prototype模式的验证方法 --- ---
Cat4.prototype.isPrototypeOf(cat6) --- true
Cat4.prototype.isPrototypeOf(cat5) --- false
cat6.hasOwnProperty("name") --- --- true
cat6.hasOwnProperty("type") --- --- false
"name" in cat7 --- ---true
"colr" in cat7 --- ---false
    cat7[name] = mao7
    cat7[color] = gray
    cat7[type] = 猫科动物
    cat7[eat] =
function () {
    print("\u5403\u8001\u9f20");
}

javascript --- 面向对象 --- 封装的更多相关文章

  1. Javascript面向对象(封装、继承)

    Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...

  2. JavaScript面向对象--封装

    一.封装的概念 面向对象的类包括两大成员,一种是暴露给外部的接口,另一种是只在类内部才能访问的私有属性.在这个类被实例化成对象后,用户只能通过操作给定的接口来访问该类内部的私有属性,这就被称为面向对象 ...

  3. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  4. javascript面向对象(一):封装

    本文来自阮一峰 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学 ...

  5. 【转】Javascript 面向对象编程(一):封装

    原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html Javascript ...

  6. Javascript 面向对象编程(一):封装 by 阮一峰

    <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd Edition) 它们都是非常优秀的Java ...

  7. JavaScript面向对象轻松入门之封装(demo by ES5、ES6、TypeScript)

    本章默认大家已经看过作者的前一篇文章 <JavaScript面向对象轻松入门之抽象> 为什么要封装? 封装(Encapsulation)就是把对象的内部属性和方法隐藏起来,外部代码访问该对 ...

  8. Javascript 面向对象编程—封装

      前  言 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类) ...

  9. Javascript 面向对象编程—继承和封装

      前  言 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类) ...

随机推荐

  1. Android 常用时间格式转换代码

    /** * 获取现在时间 * * @return 返回时间类型 yyyy-MM-dd HH:mm:ss */ public static Date getNowDate() { Date curren ...

  2. intelliJ IDEA中项目以jar包的形式导出

    在上一篇中把intelliJ IDEA安装并配置完事后,我们就可以写scala程序了.编写完scala程序后我们要把程序导出,上传到服务器上,在spark集群下运行,下面就讲一下包的导出过程以及包在服 ...

  3. SSIS ->> Data Flow Design And Tuning

    Requirements: Source and destination system impact Processing time windows and performance Destinati ...

  4. 【图像算法】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    图像算法:图像阈值分割 SkySeraph Dec 21st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified Da ...

  5. jdk、apache-ant结合yuicompressor配置的CSS与JS合并压缩工具

    前序:网上很多css与js合并打包工具,其中最流行的就是ant结合yui-compressor,鉴于学习与工作需要今天就学习了一下这种方式,供大家学习交流. 步骤:1.安装jdk,并配置其变量环境:有 ...

  6. android开发 eclipse alt+”/”自动提示失效

    http://blog.unvs.cn/archives/android-eclipse-alt.html 按照其中的第一条+第二条 处理 注意:abcd要替换为 abcdefghijklmnopqr ...

  7. hdu - 1829 A Bug's Life (并查集)&&poj - 2492 A Bug's Life && poj 1703 Find them, Catch them

    http://acm.hdu.edu.cn/showproblem.php?pid=1829 http://poj.org/problem?id=2492 臭虫有两种性别,并且只有异性相吸,给定n条臭 ...

  8. zoj 3329 One Person Game (有环 的 概率dp)

    题目链接 这个题看的别人的思路,自己根本想不出来这种设方程的思路. 题意: 有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当 ...

  9. As of ADT 14, resource fields cannot be used as switch cases

        在导入Android Sample的ApiDemos的时候,发现R.id.xx的文件不能够在 switch cases 中使用 在google查询了下,找到以下答案: As of ADT 14 ...

  10. XE4 IOS开发环境配置

    l 配置IOS的安装开发环境 使用RAD XE4开发IOS程序,一台MAC是必须的(也可以用虚拟机), MAC上需要安装Xcode, 独立版本的Commnand Line Tools 以及RAD的pa ...