javascript对象中的constructor,prototype和__proto__
2017-09-08 11:58
579 查看
文章转自:http://www.cnblogs.com/winderby/articles/4039816.html
constructor是构造函数的原型的一个属性,他指向这个对象的构造函数。
当创建一个构造函数时,他的原型自动创建constructor属性,结构如
Tree.prototype = { constructor: Tree .... }
实例化对象访问constructor实际访问的是构造函数的原型,
每一个构造函数都有一个属性叫做原型(prototype),如。
他的重要意义是,每一个通过构造函数实例化的对象都可以访问构造函数的原型
__proto__是实例化的对象的一个属性,它指向构造函数的原型,如
当我们改变实例化对象的__proto__,指向另一个对象,这个实例化可以访问其所有属性,但其属性不是实例化对象所有,Zepto框架就是这个原理。
这里来详细分析一个经典的例子,可以很好地理解对象的结构
上述代码对象的结构图,如下:
1.constructor
constructor是构造函数的原型的一个属性,他指向这个对象的构造函数。function Tree(name) { this.name = name; } var theTree = new Tree('Redwood'); console.log(Tree.prototype.constructor);// function Tree(name){this.name = name} console.log(Tree.prototype.constructor === Tree);//true}
当创建一个构造函数时,他的原型自动创建constructor属性,结构如
Tree.prototype = { constructor: Tree .... }
实例化对象访问constructor实际访问的是构造函数的原型,
function Tree(name) { this.name = name; } var theTree = new Tree('Redwood'); console.log( theT 4000 ree.hasOwnProperty('constructor') ) // false console.log( Tree.prototype.hasOwnProperty('constructor') ) // true
2.prototype
每一个构造函数都有一个属性叫做原型(prototype),如。function Tree(name) { this.name = name; } console.log(Tree.prototype); //Object { ... }
他的重要意义是,每一个通过构造函数实例化的对象都可以访问构造函数的原型
function Tree(name) { this.name = name; } Tree.prototype.show = function(){ alert(this.name) } var theTree = new Tree("Redwood") var theTree2 = new Tree("Blackwood") theTree.show(); //Redwood theTree2.show(); //Blackwood
3.__ptroto__
__proto__是实例化的对象的一个属性,它指向构造函数的原型,如function Tree(name) { this.name = name; } var theTree = new Tree("Redwood") console.log(theTree.__proto__ === Tree.prototype)//true
当我们改变实例化对象的__proto__,指向另一个对象,这个实例化可以访问其所有属性,但其属性不是实例化对象所有,Zepto框架就是这个原理。
function Tree(name) { this.name = name; } var theTree = new Tree("Redwood") console.log(theTree.hasProperty("show"))//false theTree.__proto__ = { show: function(){ alert(this.name) } } theTree.show()//Redwood
4.javascript对象中的constructor,prototype和__proto__
这里来详细分析一个经典的例子,可以很好地理解对象的结构// 构造函数 function Foo(y) { // this 指向实例化对象 // 添加对象的属性"y" this.y = y; } // 可以通过语句向Foo.prototype对象中添加属性 // 当实例化时,实例化对象会继承这个属性 Foo.prototype.x = 10; // 添加函数属性 Foo.prototype.calculate = function (z) { return this.x + this.y + z; }; // 用Foo实例化两个对象 var b = new Foo(20); var c = new Foo(30); // 调用继承的函数属性 b.calculate(30); // 60 c.calculate(40); // 80 // 仔细分析相关属性 console.log( b.__proto__ === Foo.prototype, // true c.__proto__ === Foo.prototype, // true // "Foo.prototype"自动创建一个属性 // "constructor",指向构造函数 // 实例化对象可以通过访问构造函数的原型来访问它 b.constructor === Foo, // true c.constructor === Foo, // true Foo.prototype.constructor === Foo, // true b.calculate === b.__proto__.calculate, // true b.__proto__.calculate === Foo.prototype.calculate // true );
上述代码对象的结构图,如下:
相关文章推荐
- javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)
- 15条规则解析JavaScript对象布局(__proto__、prototype、constructor)
- 15条规则解析JavaScript对象布局(__proto__、prototype、constructor)
- javascript中对象在OOP方面的一些知识(主要是prototype和__proto__相关)
- js中一切皆为对象 JavaScript中__proto__与prototype的关系
- Javascript中的__proto__、prototype、constructor
- javascript prototype 、_proto_和constructor之间的关系
- 对于JavaScript对象的prototype和__proto__的理解
- Javascript中的__proto__、prototype、constructor
- 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
- Javascript中的__proto__、prototype、constructor
- javascript学习——constructor、prototype、_proto_的区别
- 关于JavaScript的prototype、__proto__、constructor、this
- javascript prototype&_proto_&constructor
- JavaScript prototype constructor __proto__
- 深入理解JavaScript原型:prototype,__proto__和constructor
- javascript中prototype、constructor以及__proto__之间的三角关系
- 【JavaScript】(6)Object、String、Array、Date对象的方法、属性(constructor、prototype)
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- JS对象进阶-理解prototype、proto、constructor