`
zccst
  • 浏览: 3290293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Object]面向对象编程(高程版)(三)组合使用构造函数和原型模式

阅读更多
四、组合使用构造函数和原型模式
创建自定义类型的最常见方式,是组合使用构造函数模式与原型模式。构造函数用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享这对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是几两种模式之长。下面的代码重写了前面的例子:
function Person(name, age, job){
    this.name = name;
    this.age  = age;
    this.job  = job;
    this.friends = ["Shelby","Court"];
}

Person.prototype = {
    constructor:Person,
    sayName:function(){
        alert(this.name);
    }
}

var p1 = new Person("Nicholas", 29, "Software Engineer");
var p2 = new Person("Greg", 29, "Doctor");

p1.friends.push("Van");
alert(p1.friends); //"Nicholas,Greg,Van"
alert(p2.friends); //"Nicholas,Greg"
alert(p1.friends == p2.friends); // false;
alert(p1.sayName == p2.sayName); // true

在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的属性constructor和方法sayName()则是在原型中定义的。而修改了p1.friends,并不会影响p2.friends,因为它们分别引用了不同的数组。

这种构造函数和原型混成的模式,是目前在ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法。可以说,这是用来定义引用类型的一种默认模式。






2014-6-16

至此,可以对构造函数,原型,对象三者之间的关系再做一个完整的总结:
一、对于一个构造函数,必须包含:
1,属性prototype,指向原型对象的指针
2,属性[[prototype]](也叫__prototype__)指向Function.prototype。
而Function.prototype的[[prototype]]也指向Object.prototype。(2014-07-01补充)

二、自定义构造函数后,其prototype对象,必须包含
1,属性constructor,这是谁的原型,是指向prototype属性所在的函数的指针

2,继承自Object的属性和方法
原型里还有一个隐藏的[[prototype]]属性指针,指向Object的原型对象(Object.prototype)。而Object.prototype的[[prototype]]则是null,因为它已经是原型链的最顶层。

3,自定义的属性和方法


三、对于一个对象,必须包含:
1,属性[[prototype]],指向原型对象的指针
换句话说,对象与构造函数没有直接的关系

对象也即实例,他拥有实例属性、方法,也拥有原型属性、方法。
对象的实例属性、方法是自己的。与他人不共享的。
对象的原型属性、方法是共享的。与他人共用一份,原因在对象仅仅有一个属性[[prototype]],指向原型对象(里面有属性、方法)

hasOwnProperty("name");//只有实例属性中存在才返回TRUE
alert("name" in p1);   //不管name是实例属性,还是原型属性,都返回TRUE


三者之间的关系(包括与Function、Object的关系)
批注:没涉及到继承
function Foo(y){
    this.y = y;
}
Foo.prototype.x = 10;
Foo.prototype.calculate = function(z){
    return this.x + this.y + z;
}
var b = new Foo(20);
var c = new Foo(30);
b.calculate(30);//60
c.calculate(40);//80





关于重写对象原型的问题:
function Person(){}
var friend = new Person();
Person.prototype = {
	name:"Nicholas",
	age:29,
	job:"Software Engineer",
	sayName:function(){
		alert(this.name);
	}
};
friend.sayName();//error

结论:重写原型对象切断了现有原型与任何之前已存在的对象实例之间的联系,它们引用的仍然是最初的原型


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
  • 大小: 64.7 KB
分享到:
评论

相关推荐

    深入理解JavaScript系列.chm

    26.设计模式之构造函数模式 27.设计模式之建造者模式 28.设计模式之工厂模式 29.设计模式之装饰者模式 30.设计模式之外观模式 31.设计模式之代理模式 32.设计模式之观察者模式 33.设计模式之策略模式 34.设计模式之...

    javascript基于原型链的继承及call和apply函数用法分析

    本文实例讲述了javascript基于原型...所有通过对象直接量创建的对象都具有同一个函数原型,并且可以通过Object.prototype获得对原型对象的引用,通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属

    二十三种设计模式【PDF版】

    如果你有一定的面向对象编程经验,你会发现其中某些设计模式你已经无意识的使用过了;如果你是一个新手,那么从开始就 培养自己良好的编程习惯(让你的的程序使用通用的模式,便于他人理解;让你自己减少重复性的编程工作)...

    深入理解JavaScript系列

    深入理解JavaScript系列(26):设计模式之构造函数模式 深入理解JavaScript系列(27):设计模式之建造者模式 深入理解JavaScript系列(28):设计模式之工厂模式 深入理解JavaScript系列(29):设计模式之装饰...

    JavaScript基础和实例代码

    4.1 面向对象编程与基于对象编程 4.1.1 什么是对象 4.1.2 面向对象编程 4.1.3 面向对象编程:继承 4.1.4 面向对象编程:封装 4.1.5 面向对象编程:多态 4.1.6 基于对象编程 4.2 JavaScript对象的生成 4.2.1 HTML文档...

    源文件程序天下JAVASCRIPT实例自学手册

    4.1 面向对象编程与基于对象编程 4.1.1 什么是对象 4.1.2 面向对象编程 4.1.3 面向对象编程:继承 4.1.4 面向对象编程:封装 4.1.5 面向对象编程:多态 4.1.6 基于对象编程 4.2 JavaScript对象的生成 4.2.1 HTML文档...

    VanillaJS-Object-Oriented-Notes:有关JS ES6的面向对象的注释

    教程4 使用Object.create()方法和prototype.constructor参数进行原型制作。教程5 Object.create()方法及其用法。Tutorial6,Tutorial7 [Javascript ES 6 +] 定义类,构造函数,就像其他编程语言一样。 清除oop...

    深入理解JavaScript系列(.chm)

    深入理解JavaScript系列(26):设计模式之构造函数模式 深入理解JavaScript系列(27):设计模式之建造者模式 深入理解JavaScript系列(28):设计模式之工厂模式 深入理解JavaScript系列(29):设计模式之装饰...

    在JavaScript中实现类的方式探讨

    有没有可能在 javascript 中实现面向对象编程的方式呢? 答案是可能的,javascript 是可以创建对象的!这种对象可以包含数据及能够操作数据的方法,甚至可以包含其他对象。它没有类但拥有构造函数;它没有类继承...

    JavaScript面向对象的程序设计(犯迷糊的小羊)

    “面向对象编程”(Object Oriented Programming,缩写为OOP)本身是一种编程的思维模式,它把世界的一切看作是对象的集合,世界的运转就是靠一个个对象分工、合作的结果,体现一切皆“对象”思想; 而在程序设计...

    asp.net知识库

    静态构造函数 忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何...

    Delphi5开发人员指南

    2.16 面向对象编程 57 2.17 使用Delphi对象 58 2.17.1 声明和实例化 58 2.17.2 析构 59 2.18 方法 59 2.18.1 方法的类型 60 2.18.2 属性 61 2.18.3 可见性表示符 62 2.18.4 友类 62 2.18.5 对象的秘密 63 2.18.6 T...

    Spring面试题

    面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 是对应用执行过程中的...

    Spring API

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...

    Spring中文帮助文档

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...

    JavaScript中的类(Class)详细介绍

    在JavaScript中,可以使用类(Class)来实现面向对象编程(Object Oriented Programming)。不过,JavaScript中的类与Java中的有所不同,其相应的定义和使用也不一样。 JavaScript中类的定义 在JavaScript中,所有从同一...

    JavaScript的六种继承方式(推荐)

    继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的。 原型链 首先得要明白什么是原型链,在一篇文章看懂proto和prototype的关系及区别中讲得非常...

    JavaScript继承学习笔记【新手必看】

    JavaScript作为一个面向对象语言(JS是基于对象的),可以实现继承是必不可少的,但是由于本身并没有类的概念,所以不会像真正的面向对象编程语言通过类实现继承,但可以通过其他方法实现继承。实现继承的方法很多,...

    JavaScript高级教程

    第 1 章 JavaScript 是什么..........3.5.4 混合的构造函数/原型方式..............................................81 3.5.5 动态原型方法..............................................82 3.5.6 混合工厂方式........

Global site tag (gtag.js) - Google Analytics