原型链之prototype/__proto__/constructor

(一)prototype

每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。

通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性

(二)__proto__

根据ECMA定义 ‘to the value of its constructor’s "prototype" ‘ ----指向创建这个对象的构造函数的显式原型(prototype)

举例说明:

function A(){}

A.prototype = {from:‘构造函数的prototype‘}

var a = new A()

a.__proto__ === A.prototype //true   

每个对象都有一个内置属性[[prototype]],在ES5之前没有标准的方法访问这个内置属性,但是大多数浏览器都支持通过__proto__来访问。ES5中有了对于这个内置属性标准的Get方法Object.getPrototypeOf(). 
Object.prototype 这个对象是个例外,它的__proto__值为null

原型链的实现原理:当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去。

(三)对象原型分析

刚刚已经讲到,__proto__指向创建这个对象的构造函数的显式原型,那么关键我们只需要判断该对象的构造函数prototype即可

1. 对象字面量

var a = {b:1}//等效于
var a = new Object(); a.b=1;

a.__proto__ === Object.prototype  //true   

2. 构造函数创建的对象

function A(){}
var a = new A()
a.__proto__ === A.prototype //true

3.Object.create() 创建的对象

var prop = {b:1}
var a = Object.create(prop)
a.__proto__ === prop //true

(四)constructor

构造函数prototype对象会初始化一个constructor属性,它指向的就是构造函数本身

function A(){}
var a = new A()
a.__proto__.constructor === A.prototype.constructor
A.prototype.constructor === A

所以,我们可以根据对象的constructor属性,得到创建该对象的构造函数

时间: 2024-10-07 13:47:29

原型链之prototype/__proto__/constructor的相关文章

js 原型链 prototype __proto__

1.说明 函数(Function)才有prototype属性,对象(除Object)拥有__proto__. 2.prototype与__proto__区别 示例: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-w

实践一些js中的prototype, __proto__, constructor

<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="stylesheet" type="text/css" href="ExtJs/

Prototype and Constructor in JavaScript

The concept of prototype in JavaScript is very confusing, especially to those who come with a C++/JAVA/... background. As an OOP langauge, JavaScript is very different from the languages with class. Its classless feature make it somehow difficult to

js高级构造函数,实例对象和原型对象——prototype、__proto__和constructor构造器

一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别. 先上代码,最常用的: function Person(name, age) { this.name = name; this.age = age; this.eat= function() { alert('吃西红柿') } } var person1 = new Person('小米', 28

15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图: 相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称之

原型和原型对象(__proto__和prototype)转

看了之后我总算对原型继承有了更深刻的理解,做爱分享的姑娘,原文链接:理解Javascript 原型 我(个人)不喜欢的,就是讲原型时上来就拿类做比较的,所以我不会这样讲.不过我的确讲过构造器函数,在这方面和类多多少少有共通之处.我的建议是:忘掉类.有很多观点认为“类”学的泛滥是面向对象的过度发展,是一种悲哀,以至于有太多的开发者几乎把面向对象和类划上了等号.在学习原型之前,我请你先记住并品味这句话: 面向对象设计的精髓在于“抽象”二字,类是实现实体抽象的一种手段,但不是唯一一种. prototy

js中__proto__(内部原型)和prototype(构造器原型)的关系

一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) Number.__proto__ === Function.prototype  // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype  // true Object.__proto__ === Function.prototy

Object.prototype.__proto__ 、Object.prototype和 Object.prototype.constructor

Object.prototype.__proto__: 实体对象指向造它的构造函数的 prototype属性所指 的对象 ,实例的__proto__是引用构造函数的prototype属性所指对象, Object.prototype : js规定,构造函数有prototype 属性,指向一个对象,这个对象一般就是构造函数的公有成员. 所以 __proto__  和 prototype 可以指向同一个对象  {key1:value1,key2:value2,......},构造函数的私有和特权函数会

javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图:  相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称