prototype 以及 constructor 属性的理解

1 为什么 xx.constructor.prototype 可以访问到当前对象的原型。

‘str‘.constructor.prototype

‘str‘.constructor 指向当前对象的构造函数

(构造函数).prototype:即函数的prototype 属性

1 函数有prototype属性,所以可以访问到

2 函数的prototype属性会在创建实例的时候作为实例的原型而存在。

所以 ‘str‘.constructor.prototype 就可以访问到当前对象实例的原型。

1

‘str‘.constructor  == String

true.constructor == Boolean

(1).constructor == Number

{}.constructor == Object

[].constructor == Array

function(){}.constructor == Function

2

Array.constructor

Object.constructor

Function.constructor

Number.constructor

String.constructor

Boolean.constructor

result:全部都是:function Function(){}

推论:

内置对象的构造器,全部都是 function Function(){},包括Function本身。

所以js所有的内置对象的构造器都是 function Function(){}

3

Number.__proto__ === Function.prototype  // true

Boolean.__proto__ === Function.prototype // true

String.__proto__ === Function.prototype  // true

Object.__proto__ === Function.prototype  // true

Function.__proto__ === Function.prototype // true

Array.__proto__ === Function.prototype   // true

RegExp.__proto__ === Function.prototype  // true

Error.__proto__ === Function.prototype   // true

Date.__proto__ === Function.prototype    // true

4

Function.prototype.__proto__ == Object.prototype

Object.prototype.__proto__ == Object.prototype

Number.prototype.__proto__ == Object.prototype

Boolean.prototype.__proto__ == Object.prototype

String.prototype.__proto__ == Object.prototype

Array.prototype.__proto__ == Object.prototype

RegExp.prototype.__proto__ == Object.prototype

Error.prototype.__proto__ == Object.prototype

Date.prototype.__proto__ == Object.prototype

推论:

1 只有函数才有 prototype属性

2 所以上面的 XXX.prototype 中的XXX都是构造函数

3 又有2中的 XXX.__proto__

所以:XXX既可以是内置对象,也可以是构造函数。根据情景判断。

结论: Object的所有实例的原型都是 Object.prototype

Object.constructor == Function

Function.prototype.__proto__ == Object.prototype;

并且:Object.prototype.__proto__ == null;

Prototype

1 js的对象都拥有内部属性 [[prototype]] 指向其原型对象。

[[prototype]] 被称为 原型属性。

2 内部属性不可以直接访问.error: obj[[prototype]],但是可以间接访问 [[prototype]]

a  ECMA:标准对象原型访问器Object.getPrototype(object)(到目前为止只有Firefox和chrome实现了此访问器);

b  非标准访问器:__proto__(除了IE)

c  obj.constructor.prototype

js的一切皆是对象,所以 函数也是对象.又因为对象拥有内部属性 [[prototype]],所以

函数也拥有内部属性 [[prototype]].

其次:函数同时拥有属性 prototype.prototype属性和 [[prototype]]并非同一个属性。

prototype属性指向一个对象,称为原型对象。

所以:一个函数的原型属性(function’s prototype property ) 和函数实际的原型(prototype)没有关系

原型对象的作用:

当函数fn被用作构造函数时,其所创建的所有实例的 内部属性 [[prototype]] 指向 fn 的 prototype属性。

原型的作用:

1 构建原型链

当对象调用某个方法时,如果其本身不存在此方法,就会往其原型中寻找,直到原型链的顶端。

原型链的作用:

多个实例都需要的方法可以被抽出放到原型中,从而只需要定义一次,实现多个对象共享方法

Constructor

JS的所有对象都拥有constructor属性,指向其构造函数。

函数的原型对象也是对象,所以原型对象也拥有constructor属性。

并且JS定下了规则:

fn.prototype.constructor == fn;

即: 函数的prototype属性的constructor字段,指向当前prototype属性的拥有者,也就是构造函数本身。

由 fn.prototype.constructor == fn;推导出来的结论:

构造函数的实例的 constructor属性 指向其构造函数。

推导:

var a = new fn();

首先在a本身寻找:没有找到 constructor属性.再往原型链向上查找,找到a的原型,也就是 fn.prototype,发现了 constructor属性

所以就相当于 构造函数的实例的 constructor属性始终指向其构造函数。

时间: 2024-10-18 12:12:48

prototype 以及 constructor 属性的理解的相关文章

prototype和constructor之初理解

因为整理以前的笔记,发现了这两个东西,也算是我对他们最初的最幼稚的理解吧. 乍一回忆,prototype是为一个大的类增加行为用的,而这个行为实例们普遍都要用到:而constructor顾名思义是构造,构造函数? 先说说prototype,因为理解的很浅,感觉没啥好说的,直接上个例子: 1 function Person() { 2 this.age = 20; 3 this.name = 'hello world'; 4 } 5 6 Person.prototype.show = functi

《prototype属性的理解》

1.对象:对象是JS的基本数据类型(原始类型(数字.字符串和布尔值),对象类型).对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 2.三类JS对象和两类属性: 内置对象:是由ECMAScript规范定义的对象或类.例如,数组(Array).函数(Function).日期(Date)和正则表达式(RegExp)都是内置对象 宿主对象:由JS解释器所嵌入的宿主环境定义的.客户端JS中表示网页结构的HTMLElement对象均是宿主对象,既然宿主环境定义的方法可以

js深入学习-js prototype constructor属性区别

在很多js 插件中出现这两个属性的频率很高,我自己写插件时,也用到过,知道用,不知道具体的区别,今天研究了下, constructor 返回的是对象(类型的实例)的构造函数,通过prototype 添加的属性和方法不会返回. prototype 返回的是类型的原型,不会饭后构造函数部分. 实例如下: <html> <head> <script type="text/javascript">    var cat=function (name,sex)

关于prototype属性的理解

众所周知,prototype是一个属性对象,只要创建一个新函数,就会根据特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象.在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针. 需要注意的是,prototype是一个对象,他具体的内部结构是这样的: //创建一个原型对象 function Foo(){}; console.log(typeof Foo.prototype); // '

为什么要设置Javascript对象prototype的constructor

最近读了一篇关于Javascript面向对象编程的文章,里面介绍了Javascript中的类,对象,属性,方法,构造函数,继承,封装,抽象和多态性.读完之后感觉受益匪浅,对Javascript有了进一步的认识.文章的地址在这里. 在讲到继承的时候,文章里面用了如下的例子 // define the Person Class function Person() {} Person.prototype.walk = function(){ alert ('I am walking!'); }; Pe

JavaScript对象中的constructor属性

constructor属性始终指向创建当前对象的构造函数. 比如下面的例子: 1 // 等价于 var foo = new Array(1, 56, 34, 12); 2 var arr = [1, 56, 34, 12]; 3 console.log(arr.constructor === Array); // true 4 // 等价于 var foo = new Function(); 5 var Foo = function() { }; 6 console.log(Foo.constr

js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别

__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性.(据说和一个对象的attr类似,比如dom对象中) prototype:每个构造函数都有一个prototype对象,这个对象指向该构造函数的原型. 对象自身属性方法和原型中的属性方法的区别: 对象自身的属性和方法只对该对象有效,而原型链中的属性方法对所有实例有效. 例子: function bas

js中的prototype和constructor

本文正确性有待商榷,高手路过请不吝指教 1.js中只有对象,包括对象,函数,常量等. 对象不用解释.函数也有属性,常见之一就是prototype.常量也有属性: (3).__proto__;//Number {} 2.函数的prototype 函数是一种特殊的对象,它可以直接通过小括号来执行自身代码. 函数还有一个特殊的属性prototype,它也是一个对象. prototype对象也有一个特殊的属性constructor,初始的时候它是指向该函数的. 也就是当js解释到function关键字的

js继承 prototype和constructor

function a(){                 this.name="aaa";             }             function b(){                 this.age=100;             } 我们定义两个function,当我们实例化的对象的时候的操作是这样的 var A=new a(); 1.创建一个对象(有constructor属性及[[Prototype]]属性),根据ECMA,其中[[Prototype]]属