`

javascript prototype chain

 
阅读更多

javascript是基于原型的继承,每个对象都有一个原型对象,原型对象又有自己的原型对象……这样组成一条“原型链”,直到Object.prototype为止,Object.prototype就没有原型对象了,它的原型对象指向null

当在一个对象上查找属性时,先在这个对象自己的属性里查找,称为own property,如果没有找到,就到它的原型对象上查找,直到Object.prototype为止

通过对象字面量创建的对象:

{name:"kyfxbl"}

它的原型对象直接就是Object.prototype

通过构造函数创建的对象:

function Person(){
}

Person.prototype.sayHello = function(){
}

var person = new Person();

原型对象是Person.prototype,Person.prototype的原型对象是Object.prototype

函数在javascript中也是对象,本质上也是通过构造函数创建的,构造函数是Function,所以每个函数的原型对象都是Funtion.prototype,Function.prototype的原型对象也是Object.prototype

function Person(){

}

var person = new Person();

console.log(Person.__proto__ == Function.prototype);// true
console.log(person.__proto__ == Person.prototype);// true

前面说过,原型对象是javascript引擎查找对象属性的时候隐式使用的,一般不会直接在代码中引用一个对象的原型对象,不过chrome,safari,firefox的实现,提供了一个__proto__属性,指向对象的原型对象

function Person(){

}

Person.prototype.sayHello = function(){
    console.log("hello world");
}

var person = new Person();

console.log(person.__proto__ == Person.prototype);// true

利用这个属性,可以指定一个对象的原型对象,不过这并不是常见的做法,也不能保证可移植性,因为并非所有的javascript实现都支持这个属性:

function Person(){

}

Person.prototype.sayHello = function(){
    console.log("hello world");
}

var o = {};

console.log(o.__proto__ == Object.prototype);// true,此时o的原型对象是Object.prototype

o.__proto__ = Person.prototype;

o.sayHello();// hello world

var obj = {name:"kyfxbl"};

var o = {};

o.__proto__ = obj;

console.log(o.name);// kyfxbl


分享到:
评论

相关推荐

    JavaScript 面向对象编程详细讲解文档

    虽然 JavaScript 是脚本语言, 但它所支持的面向对象编程也是非常强大的。虽然它没有类和实例, 但它有对象, 原型和隐式的继承。...在另外一篇文章里, 我还会详细地讲解有关 "原型链 (prototype chain)" 的知识。

    JavaScript中的原型链prototype介绍

    JavaScript中的继承是通过原型链(prototype chain)来完成的:每个对象内部都有另外一个对象作为其prototype而存在,对象从这个prototype中继承属性(property)。对于每个对象来说,可以用以下三种方式来访问其原型...

    JavaScript中的类与实例实现方法

    JavaScript 中没有父类, 子类的概念, 也没有class 和 instance 的概念, 全靠 prototype chain来实现继承. 当查找一个对象的属性时, JavaScript 会向上遍历 prototype chain, 直到找到对应的属性为止. 有几种方法, ...

    get-prototype-chain:返回对象原型链的数组

    安装npm install --save get-prototype-chain用法const getPrototypeChain = require ( 'get-prototype-chain' ) ;class A {}class B extends A {}class C extends B {}var obj = new C ( ) ;getPrototypeChain ( ...

    prototype-chain-irl

    IRL 所以……我决定就 Javascript 中的一些重要内容进行高级别的讨论,然后尝试举一个例子……以供记住…… 我预计这次谈话可能会崩溃和燃烧……所以当这种情况发生时……我会没事的……然后羞愧地躲到角落里。...

    IE8 新增的Javascript 开发接口说明

    Defines the properties and methods inherited by objects in the Attr Constructor prototype chain. BehaviorUrnsCollection Constructor Defines the properties and methods inherited by objects in the ...

    javascript继承机制实例详解

    初学javascript一般很难理解Javascript语言的继承机制它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。...

    JavaScript原型继承之基础机制分析

    这一语言功能的本质依赖于 JavaScript 特有的原型链(prototype chain)模式。 所以严格意义上说,JavaScript 是基于原型的面向对象语言。也就是说,每个实例对象都具有一个原型。对象从该原型中继承属性和方法。 1、...

    Javascript继承机制的设计思想分享

     它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。  我花了很多时间,学习这个部分,还做了很多笔记。...

    javascript-learning:Javascript开发人员之路

    The road to javascript developer pro> data-binding <> inheritation <类式继承(class)组合式继承(combination)构造函数式继承(constructor)多继承(multi)寄生式继承(parasitic)寄生组合式继承(parasitic-...

    JS原型和原型链原理与用法实例详解

    它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。 Brendan Eich设计javascript之初是为了实现网页与浏览器...

    浅谈javascript的原型继承

    请看源码: 代码如下: function clone(o) { var F = function... var ExtObject = Ext.Object = { chain: function (object) { TemplateClass.prototype = object; var result = new TemplateClass(); TemplateClass.p

    Beginning SOLID Principles and Design Patterns for ASP.NET Developers.pdf

    ■Chapter 3: Creational Patterns: Singleton, Factory Method, and Prototype ■Chapter 4: Creational Patterns: Abstract Factory and Builder ■Chapter 5: Structural Patterns: Adapter, Bridge, Composite,...

    nest-object-deep-copy:一个纯Javascript函数执行真实对象的硬拷贝

    什么这是纯JavaScript函数,旨在从原始javascript对象创建真实的硬拷贝。为什么它只是一个纯函数,最终的导入大小仅为662个字节。 它给你真正的硬拷贝,避免使用传播经营者,Object.assign和JSON.parse(JSON....

    must-promise:适用于Must.js的Promise断言插件

    Must.prototype.chain() Must.prototype.isEnumerable() 希望这些最终将在永久公开。 用法 var must = require ( 'must' ) ; var mustPromise = require ( 'must-promise' ) ; mustPromise ( must ) ; 匹配器 ...

    all-keys:获取对象的所有属性键,包括不可枚举和继承的

    prototype ) ; /* [ 'constructor', 'toString', 'valueOf' ] */ allKeys ( Symbol . prototype ) ; /* Set { 'constructor', 'toString', 'valueOf', 'toLocaleString', 'hasOwnProperty', '...

    functional-promises:编写类似故事的代码,并提供强大的Fluent(功能链接)API

    熟悉的方法,包括Array.prototype.map , [].filter() , [].find() , [].some()等。 在JavaScript中创建Monad(只要它们包含指令序列的副作用)。 无点代码很容易实现(没有临时变量)。 更高的代码测试覆盖率...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

    inherits-ex.js:与浏览器友好的增强继承和混合功能,与标准的node.js完全兼容,继承和Coffee-Script

    继承前 浏览器友好的增强继承与node.js的标准完全兼容, 和动态继承或创建。 该软件包修改并增强了节点环境中从node.js util模块inherits的标准。 它还具有不支持Object.create旧浏览器的填充程序。...

Global site tag (gtag.js) - Google Analytics