javascript学习笔记10(基于组合与动态原型创建对象)

基于组合与动态原型创建对象

方法一:在外部设置prototype

<script type="text/javascript">
/**
 * 为了解决原型所带来的问题,此处需要通过组合构造函数和原型来实现对象的创建
 * 将属性在构造函数中定义,将方法在原型中定义
 * 这种有效集合了两者的优点,是目前最为常用的一种方式
 */
    function Person(name,age,friends){
        //属性在构造函数中定义
        this.name = name;
        this.age = age;
        this.friends = friends;
    }
    Person.prototype = {
        constructor:Person,
        //方法在原型中定义
        say:function() {
            alert(this.name+"["+this.friends+"]");
        }
    }
    //此时所以的属性都是保存在自己的空间中的
    var p1 = new Person("Leon",23,["Ada","Chris"]);
    p1.name = "John";
    p1.friends.push("Mike");//为p1增加了一个朋友
    p1.say();
    var p2 = new Person("Ada",33,["Leon"]);
    //此时原型中就多了一个Mike,这就是原型所带来的第二个问题
    p2.say();//leon ada chris mike
</script>

方法二:内部设置,prototype设置为单例,减少资源浪费

<script type="text/javascript">
/**
 * 为了让定义的方式更加符合java的需求,就把定义方法的原型代码放置到Person这个构造函数中
 */
    function Person(name,age,friends){
        //属性在构造函数中定义
        this.name = name;
        this.age = age;
        this.friends = friends;
        
        //不能使用重写的方式定义
        /*Person.prototype = {
            constructor:Person,
            //方法在原型中定义
            say:function() {
                alert(this.name+"["+this.friends+"]");
            }
        }*/
        /**
         * 判断Person.prototype.say是否存在,如果不存在就表示需要创建
         * 当存在之后就不会在创建了
         */
        if(!Person.prototype.say) {
            Person.prototype.say = function() {
                alert(this.name+"["+this.friends+"]");
            }    
        }
    }
    
    //此时所以的属性都是保存在自己的空间中的
    var p1 = new Person("Leon",23,["Ada","Chris"]);
    p1.name = "John";
    p1.friends.push("Mike");//为p1增加了一个朋友
    p1.say();
    var p2 = new Person("Ada",33,["Leon"]);
    //此时原型中就多了一个Mike,这就是原型所带来的第二个问题
    p2.say();//leon ada chris mike
    </script>

时间: 2024-11-10 01:13:33

javascript学习笔记10(基于组合与动态原型创建对象)的相关文章

JavaScript学习笔记(10)——JavaScript语法之操作DOM

1.页面输出用document.write()方法,但是不可以在window.onload中用,否则整个html页面将被覆盖. 2.通过javascript获取对象后,改变对象中的html内容:document.getElementById(id).innerHTML=new HTML. 3.改变对象的属性:document.getElementById(id).attribute=new value. 4.改变对象的css属性:document.getElementById(id).style

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

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

jQuery学习笔记10:Ajax技术

jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. jQuery 采用了三层封装:最底层的封装方法为:$.ajax(),而通过这层封装了第二层有三种方法:.load().$.get()和$.post(),最高层是$.getScript()和$.getJSON()方法. 函数 描述 jQuery.ajax() 执行异步 HTTP (Ajax) 请求. .ajaxComplete() 当 Ajax 请求完成时注册要调用的处理程序.这是一个

Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Ja

Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程

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

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

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

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

javascript学习笔记---ECMAScript语法(辅助)

1.区分大小写. test与Test变量是两个不同的变量 2.变量是弱变量. 与C,java等等语言变量不是很一样. 如下java代码 ? 1 2 3 4 int i =0; //再次赋值 i = 10;//ok i = "hello";//wrong 类型不匹配 javascript ? 1 2 3 4 var i = 9; //再次赋值 i = 10;//ok i = "hello";//ok 但是不建议这么干,如此会给开发造成干扰,不明确变量的类型.(变量命名

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

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