`
lukejin
  • 浏览: 365550 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Javascript原型链研究

阅读更多

前言:如果想深入理解Javascript的面向对象编程思想,那么对于原型链的理解将十分重要,由于看了李战老师的<悟透Javascript>,产生了很多疑问,于是带着疑问在网络上查找答案,也翻出了Ecma-262来看了,总算明白了一些东西。

 

一.类别和对象


在Javascript没有所谓的其他高级语言中的”类”的概念,

 

所有的”数据”除了基本“类型” 便是对象Object(普通对象object和函数对象function) .

如果从集合论的角度在思考问题,我们可以将所有的这些数据进行分类,那么可以得到如下几类:

Undefined,Null,Boolean,Number,String还有Object

所有的基本数据类型必定属于前面五种类型(Type)之一,而复杂的数据类型只有Object一种.

我们可以举例说明一下,


Undefine={undefined}

Null={null}

Boolean={true,false}

Number={0,1,2,0.1……}

String={’a',’b',’123′,…}

Object={{a:1},function f(){},…}

以上的只是简单的说明,并不严谨.

有了以上的说明我们再来看typeof这个运算符

其实typeof就是根据上面的这些类型来判断并返回结果的



 

二.内建对象(Build-in Object)


在Javascript语言中有一些内建对象(他们的typeof值为function),其中有Global,Object,Function,Array,String,Boolean,Number,Math,Date,RegExp(注意这里和上面所讲的“类别”是两码事)还有一些其他的错误类,这里暂不一一列举.这些内建对象其实都是构造器,或者说它们都是函数.这里我们可以通过new运算符创建相应的对象.如

 

var s = new String(’string’);这样得到的是一个字符串对象 ,typeof s 是”object”

 

而如果没有使用new而是var s=String(’string’);得到的是一个基本类型字符串 ,typeof s得到的是”string”

 

 

 

三.原型Prototype


由于Javascript中没有类,那通过什么来实现面向对象中的继承呢,对,就是原型,原型本身也是对象.

每一个对象都有一个隐式的原型(父原型),而函数对象除了隐式的原型引用外,还有一个显式的原型引用。

在一般情况下,对象的隐式原型是不可以访问的,而函数对象的显式原型可以通过 FunctionName.prototype进行访问,

但在Firefox中你可以通过对象的__proto__属性访问对象的隐式原型。

说了这么多,你可以还是对这两种原型没有理解,我们举个例子吧。

function Person(name){
this.name=name;
}
alert(Person.prototype);
alert(Person.prototype.constructor);
alert(Person.__proto__===Function.prototype);
alert(Person.constructor);
 
var p = new Person('Luke');
alert(p.prototype);
alert(p.__proto__===Person.prototype);
alert(p.constructor);
 

 

运行上面的代码我们可以知道,Person这个函数他的显式原型是一个object对象,而这个原型对象的构造器就是Person自己。

我们又可以知道这个函数的哦隐式原型是内置对象Function的显式原型,且我们可以知道Person的构造器是Function函数。

接着我又创建了一个对象p,可以知道如果直接使用prototype是无法访问的,结果为undefined,因为p是一个普通对象,只能在Firefox中通过__proto__来访问其隐式的原型,可以知道其隐式的原型为Person的显式原型。

我这里就很武断的得出一个结论来,当然不一定正确。

一个创建的对象,如果不主动的修改其隐式的原型(当然我们无法修改),那么默认的隐式原型为其constructor的显式原型。

 

四.原型链

在原型链中Javascript内置的两个初始化函数对象尤为重要,一个就是Function,一个是Object。

 

 

 

 

写道
Function.__proto__===Function.prototype(其值都是一个匿名的空函数 function(){},我们暂称之为f)
f.__proto__为一普通object  f.__proto__.__proto__===Object.prototype
f.prototype 也为一普通object  f.prototype .__proto__===Object.prototype
Object.prototype为原型链的终点   Object.prototype.__proto__ ===null
Object是一个初始化函数对象 Object.__proto__===Function.prototype

 

下面是一个内建对象原型链的大概图示。


 

ECMA262规定了一些既定的规则,没有原因,只是为了实现某种目的且自圆其说。

 

 

 

  • 大小: 36.3 KB
  • 大小: 37.1 KB
6
1
分享到:
评论
7 楼 zx848 2012-09-24  
所有的”数据”除了基本“类型” 便是对象Object(普通对象object和函数对象function)
我记得js中所有数据都是对象
例如:
alert((10).toString());是可执行的
6 楼 laijinyan 2012-08-29  
laijinyan 写道
f.prototype 也为一普通object  f.prototype .__proto__===Object.prototype

好像不对
f.prototype 为 undefined



运行环境为 chrome 的 v8 引擎
5 楼 laijinyan 2012-08-29  
f.prototype 也为一普通object  f.prototype .__proto__===Object.prototype

好像不对
f.prototype 为 undefined
4 楼 一个人旅行 2011-03-04  
受教了。非常好的总结。
3 楼 lukejin 2010-07-12  
silasoni 写道
这样的图 用什么工具画呢 

omnigraffle  mac下的软件
2 楼 silasoni 2010-07-12  
这样的图 用什么工具画呢 
1 楼 lukejin 2010-02-05  
去年写的啦,当时还画了个图的,不见了 ,杯具。

相关推荐

    原型链全套图解.rar

    在JavaScript中,原型链是理解对象继承和属性查找机制的关键概念。它是一种基于原型(prototype)的继承方式,使得一个对象能够从另...本压缩包中的图解资料将帮助你以视觉化的方式加深对原型链的理解,推荐仔细研究。

    javascript 原型模式实现OOP的再研究

    JavaScript中的原型模式是一种实现面向对象编程(OOP)的关键机制,它基于原型继承,使得对象可以从其他对象那里获得属性和方法。...同时,理解原型链的工作原理对于编写健壮的JavaScript代码至关重要。

    JavaScript中的prototype(原型)属性研究

    1. **继承机制**:JavaScript的继承是基于原型链实现的。当试图访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript会向上查找其`__proto__`,直到找到该属性或者到达原型链的顶端(即`null`)。 2. **...

    JavaScript继承机制研究.pdf

    通过原型链,JavaScript可以实现多重继承,这使得JavaScript的继承机制更加灵活和强大。 构造函数方式继承 构造函数方式继承是一种常用的继承机制,它通过在子类的构造函数中调用父类的构造函数来实现继承。这使得...

    JavaScript_原型UI元素的集合.zip

    如果在实例对象上找不到某个属性,JavaScript会查找其原型,如果原型上也没有,会继续查找原型的原型,这一过程称为原型链。 UI元素的集合通常包括一系列用于创建网页交互功能的代码示例。例如,`ui-element-...

    javascript中对象的定义、使用以及对象和原型链操作小结

    - **继承机制**:JavaScript采用基于原型链的继承,几乎所有对象都继承自`Object.prototype`,除非其原型为`null`。这意味着,通过原型链,对象可以访问其构造函数的`prototype`上的属性和方法。 - **原型链的遍历...

    javascript学习小组研究成

    3. 高级特性:如闭包、原型链、箭头函数、Promise、async/await等,这些都是现代JavaScript开发中必不可少的工具。 4. ES6及以后的新特性:例如类、模板字符串、解构赋值、let/const声明、模块导入导出等,这些新...

    关于JavaScript的学习资料

    此外,也可能涉及了JavaScript的面向对象编程、闭包、作用域、原型链、异步编程(回调函数、Promise、async/await)以及ES6及后续版本的新特性。 另一本书《jscript5》可能专注于JavaScript的特定版本或者特定主题...

    javascript教学课件 对于研究javascript绝对是很好的资料

    了解原型链和`__proto__`、`prototype`之间的关系对于深入理解JavaScript对象至关重要。 函数表达式和箭头函数也是JavaScript中的亮点。函数表达式可以匿名定义函数,常用于立即调用的函数表达式(IIFE)和模块模式...

    javascript作业题答案

    原型则涉及JavaScript的对象继承机制,所有对象都具有一个`__proto__`属性,可以通过原型链来共享属性和方法。 文件名“第1章”可能暗示了这是一个逐步深入的系列教程,第一章可能涵盖基础概念,如变量声明、数据...

    悟透JavaScript

    在这个例子中,Person.prototype定义了一个greet方法,person1作为Person的实例,可以通过原型链访问到这个方法。 面向对象编程(OOP)思想在JavaScript中体现为类(class)和实例(instance)的概念,尽管...

    JavaScript前端开发案例教程-源代码.rar

    对象则是一种数据结构,允许我们存储键值对,通过原型链机制,JavaScript实现了面向对象编程的一些特性。在压缩包中的案例可能涵盖了这些基本概念的实践应用。 其次,前端开发不仅限于JavaScript,还涉及到HTML和...

    JavaScript书中的源码

    其次,深入理解原型和原型链是JavaScript学习的重要环节。书中源码可能会展示如何利用原型来实现继承,以及如何通过Object.prototype和__proto__属性进行对象间的关联。此外,构造函数和实例化过程也是原型链中常见...

    javascript源代码大全

    3. **原型与原型链**:JavaScript对象基于原型,通过__proto__属性或Object.getPrototypeOf方法可以访问原型。原型链是由原型对象形成的链状结构,用于实现继承。 4. **面向对象**:虽然JavaScript是基于原型而非类...

    Javascript经典实例集锦

    原型链是JavaScript实现继承的主要方式,每个对象都有一个proto属性指向它的构造函数的prototype对象。 4. **数组与集合操作**:Array对象提供了丰富的内置方法,如push、pop、shift、unshift、splice、slice等,...

    javascript源码大全(精)

    原型是JavaScript实现继承的一种方式,每个对象都有一个原型链,通过__proto__属性或Object.getPrototypeOf方法访问。了解原型、原型链、继承和构造函数的应用至关重要。 四、数组和集合 JavaScript提供了丰富的...

    学用JavaScript设计模式

    例如,在JavaScript中,我们经常会利用函数作用域和闭包来模拟私有方法和私有属性,以及使用原型链来模拟类继承。 最后,本书提供了非常实用的参考资料,包括了一些作者认可的技术专家和其推荐的博客和微博,读者...

    JavaScript前端开发程序设计教程(微课版)-教材代码.zip

    通过这份教材代码,你将能够深入理解JavaScript语法、数据类型、控制流程、函数、对象、数组、DOM操作、事件处理等核心概念,并逐步提升到更高级的主题,如闭包、原型链、异步编程和模块化。 1. **JavaScript基础...

    Javascript征途源代码

    原型链是JavaScript继承的核心,它允许一个对象继承另一个对象的属性和方法。理解这个机制对于创建可复用和可扩展的代码至关重要。此外,书中可能还涉及了ES6及以后版本的新特性,如箭头函数、解构赋值、模板字符串...

    javascript大全(包含教程、javascript特效以及技术讲座)

    教程部分可能涵盖了从基础到高级的JavaScript概念,例如变量、数据类型、控制结构(如if语句和循环)、函数、对象和原型链、闭包、异步编程(回调函数、Promise、async/await),以及ES6及更高版本的新特性,如箭头...

Global site tag (gtag.js) - Google Analytics