- 浏览: 3315876 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (567)
- Web前端-html/表单 (19)
- Web前端-CSS (24)
- Web前端-CSS框架 (4)
- Web前端-JS语言核心 (50)
- Web前端-JS客户端 (26)
- nodejs生态+grunt (10)
- seajs和requirejs (9)
- backbone等框架 (7)
- 模板基础 (7)
- Web前端-deps(不改动) (6)
- Web前端-component (10)
- Web前端-jquery-plugin (13)
- 浏览器兼容性 (6)
- Web前端-使用jQuery (25)
- Web前端-使用jqueryui (6)
- Web前端-性能优化 (3)
- Web协议-HTTP (6)
- ExtJS (13)
- PHP (22)
- PHP面向对象 (4)
- PHP扩展-SOAP (6)
- PHP扩展-curl (4)
- PHP与HTML(导出) (5)
- PHP扩展-综合 (7)
- mysql基础应用 (18)
- 技术心情 (18)
- 算法和面试题 (17)
- 工具(开发)使用 (36)
- memcached原理 (2)
- session和cookie (4)
- UML (2)
- Web前端_FusionCharts (5)
- Web前端_Flex (4)
- Web前端_JSP (3)
- JavaSE (10)
- JavaEE (4)
- tomcat (2)
- Servlet开发 (3)
- Spring开发 (1)
- REST相关 (2)
- 大访问量、高并发 (2)
- 网络编程 (1)
- YII (21)
- linux命令和内核 (12)
- yii与数据库 (10)
- yii与表单 (12)
- yii view层 (1)
- perl (7)
- yii扩展 (7)
- shell (4)
- photoshop (7)
- 视觉设计 (2)
- 我关注的名人在路上 (4)
- 1-自学能力 (1)
- 2-人际沟通能力 (3)
- 3-职业规划能力 (7)
- 4-项目管理能力 (2)
- python (3)
- django (4)
- Mysql高级应用 (6)
- prototype.js (4)
- Web系统安全 (1)
- Web前端-mobile (2)
- egret (6)
- jQuery源码分析 (5)
- fis (4)
最新评论
-
yzq21056563:
感谢作者分享~请教下,http://www.lisa33xia ...
CSS基础:text-overflow:ellipsis溢出文本 -
u012206458:
$.ajax的error,complete,success方法 -
DEMONU:
谢谢,虽然不能给你赞助,但是要给你顶
mysql中key 、primary key 、unique key 与index区别 -
njupt_tolmes:
阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿滕庆亚 ...
CSS基础:text-overflow:ellipsis溢出文本 -
zenmshuo:
用过SpreadJS,也包含数据可视化的图表
推荐几个web中常用js图表插件
四、组合使用构造函数和原型模式
创建自定义类型的最常见方式,是组合使用构造函数模式与原型模式。构造函数用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享这对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是几两种模式之长。下面的代码重写了前面的例子:
在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的属性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 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
结论:重写原型对象切断了现有原型与任何之前已存在的对象实例之间的联系,它们引用的仍然是最初的原型
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
发表评论
-
[正则]改变URL中的参数值
2015-05-20 20:37 4415作者:zccst 如果一个URL是:http://www.e ... -
理解JavaScript的单线程运行机制及setTimeout(fn,0)
2015-03-30 17:56 5594zccst整理 阮老师的链接 ... -
延迟自定义函数
2015-03-26 14:02 1056作者:zccst 如果函数内又定义了一个跟自己同名的函数,执 ... -
js语句和表达式
2015-03-11 11:21 708作者:zccst 一直觉得语句和表达式很简单,不需要专门留意 ... -
再次学习try catch finally
2015-03-10 11:26 1788作者:zccst 一、基本介绍 JavaScript的错误 ... -
[201502]封装
2015-02-07 11:59 808作者:zccst 我理解的封装是建立在熟悉面向对象和继承的基 ... -
js运算符优先级
2015-01-26 10:39 2619作者:zccst js运算符优先级也是一个巨大的坑。有时候你 ... -
《JavaScript模式》读书笔记
2015-01-23 11:59 889作者:zccst 第四章:函 ... -
js判断复合数据类型的两种方式(typeof不奏效了)
2014-11-07 17:47 2513作者:zccst typeof认为所有的复合数据类型都是&q ... -
js-闭包(权威指南版)
2014-10-27 18:42 1390作者:zccst //1,闭包是 ... -
js数据类型转换
2014-10-22 10:53 6667作者:zccst 2015-3-27 类 ... -
html5的onhashchange和history历史管理
2014-09-20 08:18 4759作者:zccst 现在的开发,越来越倾向于页面内跳转,这种情 ... -
Javascript语言精粹-毒瘤和糟粕
2014-09-16 18:37 1206作者:zccst Javascript是一门语言,用久了肯定能 ... -
[夏天Object]运行时程序执行的上下文堆栈(一)
2014-07-01 22:26 1569作者:zccst 时间:2014-07-01 这已经是第二 ... -
[Object]继承(经典版)(五)封装
2014-06-18 22:21 1134作者:zccst 封装已经上升到写插件的水平了,与多重继承属 ... -
[Object]继承(经典版)(四)多重继承和组合继承
2014-06-18 22:16 1580作者:zccst 一、多重继承 不得不说,这又是异常精彩的 ... -
[Object]继承(经典版)(三)继承理论总结
2014-06-18 22:15 1264作者:zccst 更新:在JavaScript模式中,作者 ... -
[Object]继承(经典版)(二)原型链(原型继承)
2014-06-18 22:05 1079作者:zccst 毫不夸张的说,这节是继承的核心所在。是重中 ... -
[Object]继承(经典版)(一)对象冒充和Call
2014-06-18 21:51 2547作者:zccst 先臆想一下这种方法 var a = ... -
[Object]面向对象编程(高程版)(0)属性和方法
2014-06-16 23:04 960zccst转载+原创 function Person() ...
相关推荐
JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。
面向对象编程(Object-Oriented Programming,OOP)是编程的一种重要范式,JavaScript也完全支持这一特性,尽管它并非一种传统的静态类型语言。这篇博客文章可能详细讨论了如何在JavaScript中实现面向对象编程。 在...
总结,JavaScript的构造函数模式是创建对象的主要方式之一,它结合原型和原型链提供了面向对象编程的基础。理解并掌握这一模式有助于编写可维护、可扩展的代码。在实际开发中,构造函数模式常常与其他设计模式(如...
原型链允许对象访问其构造函数原型上的属性和方法。 - 使用`Object.prototype.isPrototypeOf()`方法可以检查一个对象是否存在于原型链中。 4. **继承** - JavaScript的继承主要通过原型链实现。子类(派生类)...
理解构造函数和原型对象有助于掌握JavaScript的面向对象编程(OOP)特性。 构造函数是JavaScript中创建对象的一种特殊函数。它通常以大写字母开头,使用new关键字调用,目的是在创建新对象时初始化它们的属性和方法...
在JavaScript中,面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它允许开发者创建复杂、可重用的代码结构。本指南将深入探讨JavaScript中的面向对象特性,包括类、对象、继承、封装和...
JavaScript面向对象编程是一种基于原型(Prototype)的编程范式,它是动态类型语言,允许开发者创建具有复杂特性的对象。在JavaScript中,面向对象主要通过构造函数、原型链和闭包来实现。以下是对这一主题的详细...
"JavaScript 面向对象编程指南 第2版 .pdf"可能会涵盖如何使用构造函数、原型和实例来创建和操作对象,以及如何利用ES6的类语法。另一方面,"JavaScript 设计模式与开发实践.pdf"可能会详细讲解各种设计模式的原理、...
总的来说,JavaScript中的面向对象编程与传统的基于类的OOP有所不同,它通过原型链和构造函数来实现对象的创建和继承。正确理解并运用这些概念,可以让开发者更有效地利用JavaScript进行面向对象的编程。
在JS中,有三种基本方式来创建对象:工厂模式、构造函数模式和原型模式。这三种模式各自有其特点和适用场景,下面将逐一进行详细讲解。 1. **工厂模式**: 工厂模式在面向对象编程中是一个常用的设计模式,其目的...
面向对象编程(Object-Oriented Programming, OOP)是JavaScript的核心特性之一,它提供了多种模式来创建和操作对象。以下是对标题和描述中提到的几种JavaScript面向对象编程模式的详细解释: 1. **构造函数与字面...
JavaScript是一种支持两种主要编程范式的语言:函数...总之,JavaScript的面向对象编程依赖于原型机制,通过构造函数和原型链实现了对象的创建、继承和属性/方法的共享。理解这些概念对于深入学习JavaScript至关重要。
面向对象编程(Object-Oriented Programming,OOP)是一种强大的编程范式,它基于“对象”的概念,允许我们通过封装数据和方法来组织代码。在JavaScript中,面向对象编程并不是原生支持的,但它可以通过模拟类和对象...
总结一下,JavaScript中的面向对象编程通过构造函数、原型以及封装、继承和多态等原则,提高了代码的可读性、可维护性和复用性。通过合理地运用这些设计模式,我们可以编写出更加高效、易于理解和扩展的JavaScript...
JavaScript中实现面向对象编程的核心机制之一是构造函数和原型链。构造函数是一种特殊的函数,用于创建和初始化对象。例如: ```javascript function Person(name, email, website) { this.name = name; this....
面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一种重要编程范式,它允许开发者创建复杂的、可复用的代码结构。在本“JavaScript面向对象编程”主题中,我们将深入探讨这一概念及其在JavaScript...
首先,该文件提到的书籍是关于JavaScript面向对象编程的,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据(以字段的形式)以及代码(以方法的...
原型链是通过`__proto__`链接起来的一系列原型对象,它使得一个对象能够访问其构造函数原型上的属性和方法。我们可以使用`prototype`属性在构造函数上添加共享的方法: ```javascript Person.prototype.sayHello ...