美文网首页
【JavaScript】原型&原型链

【JavaScript】原型&原型链

作者: tmgg | 来源:发表于2017-01-09 00:41 被阅读16次

普通对象与函数对象

在javascript中万物皆对象,但对象是有区别的,分为普通对象和函数对象,那怎么区分呢,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象,Object和Function都是JS自带的函数对象,都是通过new Function()创建的。看下面的例子:

function f1(){}; 
console.log(f1.prototype) //f1{} 
console.log(typeof f1. prototype) //Object 
console.log(typeof Function.prototype) // Function,这个特殊 
console.log(typeof Object.prototype) //Object 
console.log(typeof Function.prototype.prototype) //undefined

prototype和proto的概念

prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示对象的原型的属性。

__proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性。

怎么理解呢?
简单点说,就是对象属性的修改和获取通过prototype来实现,而对象属性的继承通过__proto__来实现

new的过程

var Person = function(){};
var p = new Person();

new的过程拆分成以下三步:

(1) var p={};  // 初始化一个对象p
(2) p.\_\_proto\_\_ = Person.prototype;
(3) Person.call(p);  // 构造p,也可以称之为初始化p

总结

1.原型和原型链是JS实现继承的一种模型。
2.原型链的形成是真正是靠__proto__ 而非prototype

要深入理解这两句话,我们举个例子:

var animal = function(){};  
var dog = function(){};  
animal.price = 2000;//  
dog.prototype = animal;  
var tidy = new dog();  
console.log(dog.price) // undefined  
console.log(tidy.price) // 2000为什么呢?

画一下内存图:


这说明什么问题呢,执行dog.price的时候,发现没有price这个属性,虽然prototype指向的animal有这个属性,但它并没有去沿着这个“链”去寻找。同样,执行tidy.price的时候,也没有这个属性,但是__proto__指向了animal,它会沿着这个链去寻找,animal中有price属性,所以tidy.price输出2000。由此得出,原型链的真正形成是靠的__proto__,而不是prototype
因此,如果在这样指定dog.__proto__ = animal,那dog.price = 2000。

相关文章

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • 【JavaScript】原型&原型链

    普通对象与函数对象 在javascript中万物皆对象,但对象是有区别的,分为普通对象和函数对象,那怎么区分呢,凡...

  • 原型、原型链

    (什么是原型、原型链?有什么作用) JavaScirpt深入之从原型到原型链 图解 Javascript 原型链 ...

  • js原型、原型链、继承的理解

    一、原型、原型链 原型是Javascript中的继承的基础,JavaScript的继承主要依靠原型链来实现的。 原...

  • 【javascript】继承

    javascript只支持实现继承,而且继承主要是依靠原型链来实现的。 原型链 javascript将原型链作为实...

  • javascript碎片知识001

    javascript中的对象(原型,原型链) 什么是原型? 原型是JavaScript中的继承的基础,JavaSc...

  • javaScript原型链

    javaScript原型链概念JavaScript之继承(原型链)数据结构var Person = functio...

  • 原型和原型链篇

    原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 原型设计模式JavaScript是一种基于...

  • JavaScript面试考点之原型及原型链

    1、JavaScript原型及原型链 1)原型 JavaScript是一种基于原型的语言,即每一个对象拥有一个原型...

  • 面试题 Javascript

    介绍JavaScript的基本数据类型。 说说写JavaScript的基本规范? JavaScript原型,原型链...

网友评论

      本文标题:【JavaScript】原型&原型链

      本文链接:https://www.haomeiwen.com/subject/wsecbttx.html