转载地址:http://www.iteye.com/topic/1128242
什么是原型对象?
“我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。”
--摘自人民邮电出版社出版的Nicholas C.Zakas著的《JavaScript高级程序设计》(第2版)
上面提到的对象,就是原型对象,它的用途是“包含可以由特定类型的所有实例共享的属性和方法”。那么怎么才能访问到它呢?按照上面的说法,每个函数都有一个prototype 指针,这个指针指向了它的原型对象,所以我们可以通过函数的prototype属性来访问函数的原型对象。
下面用程序来说明。
- function SuperType(){}
- document.write(SuperType.prototype);//[object Object]
function SuperType(){} document.write(SuperType.prototype);//[object Object]
可见函数SuperType的确存在一个prototype属性,其的确是指向了一个对象。但这个对象真是原型对象吗?怎么证明?上面不是说原型对象的用途是“包含可以由特定类型的所有实例共享的属性和方法”,既然如此,那我们就来看这个对象是不是真的有这个功能。
- function SuperType(){}
- SuperType.prototype.name = 'Sam';//在SuperType.prototype指向的对象上增加了name属性
- //在SuperType.prototype指向的对象上增加了sayName方法
- SuperType.prototype.sayName = function() {
- document.write(this.name);
- };
- SuperType.prototype.setName = function(name) {
- SuperType.prototype.name = name;
- };
- var instance1 = new SuperType();
- var instance2 = new SuperType();
- instance1.sayName();//Sam
- instance2.sayName();//Sam
- instance1.setName('Luce');
- instance1.sayName();//Luce
- instance2.sayName();//Luce
function SuperType(){} SuperType.prototype.name = 'Sam';//在SuperType.prototype指向的对象上增加了name属性 //在SuperType.prototype指向的对象上增加了sayName方法 SuperType.prototype.sayName = function() { document.write(this.name); }; SuperType.prototype.setName = function(name) { SuperType.prototype.name = name; }; var instance1 = new SuperType(); var instance2 = new SuperType(); instance1.sayName();//Sam instance2.sayName();//Sam instance1.setName('Luce'); instance1.sayName();//Luce instance2.sayName();//Luce
当实例instance1调用setName()函数更改了SuperType.prototype.name的值后,instance2.sayName()也会输出Luce,说明SuperType.prototype指向的对象的确是“包含了可以由特定类型(这里是SuperType)的所有实例所共享的属性和方法”,所以由此可以得出结论:
SuperType.prototype指向的就是SuperType的原型对象,也即是函数的prototype属性指向了函数的原型对象。
下面用程序来说明构造函数、实例和原型对象三者之间的关系。
首先是构造函数与实例之间的关系,实例就是通过调用构造函数创立的:
- function SuperType(name){
- this.name = name;
- this.sayName = function(){
- document.write(this.name);
- }
- }
- var instance1 = new SuperType("Sam");
- instance1.sayName();//Sam
- var instance2 = new SuperType("Luce");
- instance2.sayName();//Luce
function SuperType(name){ this.name = name; this.sayName = function(){ document.write(this.name); } } var instance1 = new SuperType("Sam"); instance1.sayName();//Sam var instance2 = new SuperType("Luce"); instance2.sayName();//Luce
我们在构造函数里面定义了一个name属性和一个sayName()函数,当调用new SuperType()创建实例时,就会调用构造函数SuperType创建实例对象,同时为实例对象增加一个name 属性和一个sayName()方法(也即是把this换成了实例对象(如this.name换成了instance1.name),所以每个实例的name和sayName()方法都是独立的,注意和在原型对象上定义的 区别,在原型对象上定义是共享的)。
构造函数与原型对象的关系。前面已经说过,构造函数中有一个prototype属性,该属性是一个指针,指向了它的原型对象,那原型对象呢?是不是在它里面也存在一个指针,指向构造函数呢?答案是的确如此。原型对象中有一个constructor属性,该属性指向了构造函数:
- function SuperType(){}
- document.write(SuperType.prototype.constructor);//function SuperType(){}
- document.write(SuperType.prototype.constructor == SuperType);//true
function SuperType(){} document.write(SuperType.prototype.constructor);//function SuperType(){} document.write(SuperType.prototype.constructor == SuperType);//true
打印SuperType.prototype.constructor,输出的是构造函数的定义,而我们知道函数名只是一个引用,其指向函数所在的地址,所以通过SuperType.prototype.constructor和SuperType的比较,返回了true,所以SuperType.prototype.constructor和SuperType一样都指向了SuperType()函数,在这里即是指向了构造函数。
最后是实例与原型对象的关系。前面的例子可以看到(最开始),实例可以访问到在原型对象上定义的属性和方法,那么我们就可以猜测,实例中肯定有一个指针指向了原型对象,的确如此,实例中有一个属性__proto__(IE中没有这个属性,所以不要在IE下测试),该属性指向了原型对象:
- function SuperType(){}
- var instance = new SuperType();
- document.write(instance.__proto__ == SuperType.prototype);//true
function SuperType(){} var instance = new SuperType(); document.write(instance.__proto__ == SuperType.prototype);//true
SuperType.prototype指向了SuperType的原型对象,而instance.__proto__和SuperType.prototype比较返回了true,这就说明instance.__proto__也指向了SuperType的原型 对象。
以上即是JavaScript原型对象的相关信息。
相关推荐
本文将对JavaScript原型继承的方式进行介绍,并结合实例进行分析。 基于类的继承 面向对象编程语言是基于类的语言,以Java为例,Java是基于类的语言。在基于类的语言中,对象是类的实例,并且一个类可以从另一个类...
在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的概念虽然存在,但是它的实现与传统基于类的语言有所不同。ECMAScript,也就是...
- 可以通过`Object.getPrototypeOf()`或`__proto__`访问原型对象,但`__proto__`在ES6及以后的版本中不推荐使用,推荐使用`Object.getPrototypeOf`。 6. 原型问题: - 每个实例都有自己的属性,但共享方法。这...
JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...
JavaScript中的原型模式是一种实现面向对象编程(OOP)的关键机制,它基于原型继承,使得对象可以从其他对象那里获得属性和方法。在这个模式下,每个函数都有一个`prototype`属性,这个属性是一个对象,用于共享属性...
每个对象都有一个原型对象,可以通过`__proto__`属性访问。创建一个对象时,它可以继承另一个对象的属性和方法。 ```javascript function Person(name, age) { this.name = name; this.age = age; } Person....
函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript...
3. prototype:在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象称为原型对象。原型对象允许我们定义共享的属性和方法,这样所有通过该构造函数创建的对象都可以访问这些属性和方法...
### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...
原型(prototype)是JavaScript中的关键概念,每个对象都有一个隐式的__proto__属性,指向其构造函数的原型。通过原型,子对象可以访问父对象的属性和方法,实现代码共享。 多态则是指同一种行为在不同的对象上表现...
本文实例讲述了JavaScript原型对象、构造函数和实例对象功能与用法。分享给大家供大家参考,具体如下: 大家都知道,javascript中其实并没有类的概念。但是,用构造函数跟原型对象却可以模拟类的实现。在这里,就先...
- 多态是指不同对象对同一消息(方法调用)做出不同响应的能力,这在JavaScript中通过覆盖原型上的方法实现。 6. **模块化** - 面向对象编程有助于模块化代码,通过将相关的功能组织到对象中,可以提高代码的...
### JavaScript原型继承工作原理及实例详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发中扮演着重要角色。其独特的面向对象机制是通过原型继承来实现的,这种机制使得JavaScript能够灵活地...
总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...
每个对象都拥有一个指向其原型对象的内部链接,这个原型对象同样拥有一个指向其原型的链接,这样一直延续下去直到一个对象的原型为null。根据这个链接,JavaScript可以检查一个对象是否具有特定属性或方法,如果没有...
为了深入了解前端开发中的框架设计原理,以Zepto前端框架为例,利用Javascript原型链的相关知识,采用原生Javascript与框架对比的方法剖析了框架整体设计思路,细致分析了框架的大致架构,重构了Zepto对象原型,并...
### JavaScript:对象与原型链教程 #### 一、概述 本教程旨在深入解析JavaScript中对象的概念及其核心机制——原型链。我们将从数据类型入手,逐步探索函数与作用域的细节,并重点讨论对象与属性的相关知识。 ###...