1 理解JavaScript原型javascript
什么是原型?java
原型是一个对象,其余对象能够经过它实现属性继承。git
任何一个对象均可以成为原型么?函数
是this
哪些对象有原型.net
全部的对象在默认的状况下都有一个原型,由于原型自己也是对象,因此每一个原型自身又有一个原型(只有一种例外,默认的对象原型在原型链的顶端。)prototype
当咱们已经建立了一个实例对象 ,咱们想要这个实例对象继承一个已经存在的对象的功能好比说Array,就可使用原型code
函数A的原型属性(prototype property )是一个对象,当这个函数被用做构造函数来建立实例时,该函数的原型属性将被做为原型赋值给全部对象实例(注:即全部实例的原型引用的是函数的原型属性)htm
有一个原型属性,这和函数的原型是不同的
b.prototype //[object Object] 函数b的原型属性对象
b.__proto__ 或者b.construtor.prototype 函数的原型
//建立一个函数b var b = function(){ var one; } //使用b建立一个对象实例c var c = new b(); 1 b的构造函数 b.constructor; // function Function() { [native code]} 2 实例c的构造函数 c.constructor; // 即 b function(){ var one; } b.constructor==Function.constructor; c.constructor==b; 3 b的原型 b.constructor.prototype // function (){} b.__proto__ //function (){} 4 函数b的原型属性 b.prototype //[object Object] 5 c的对象的原型 c.constructor.prototype //[object Object] c.__proto__ //[object Object] //为函数b的原型属性添加一个属性max b.prototype.max = 3 //实例c也有了一个属性max c.max //3 上面的例子中,对象实例c的原型和函数的b的原型属性是同样的,若是改变b的原型属性,则对象实例c 的原型也会改变
2 js原型链原理看图说明 太简洁了,最后一个图看不懂呀
当你去定义一个prototype的时候,至关于把该实例的__proto__指向一个结构体,那么这个被指向结构体就称为该实例的原型。
var BaseCalculator = function() { this.decimalDigits = 2; }; BaseCalculator.prototype = { add: function(x, y) { return x + y; }, subtract: function(x, y) { return x - y; } }; 建立完上述代码之后,咱们来开始: var Calculator = function () { //为每一个实例都声明一个税收数字 this.tax = 5; }; Calculator.prototype = new BaseCalculator();
咱们能够看到Calculator的原型是指向到BaseCalculator的一个实例上,目的是让Calculator集成它的add(x,y)和subtract(x,y)这2个function,还有一点要说的是,因为它的原型是BaseCalculator的一个实例,因此无论你建立多少个Calculator对象实例,他们的原型指向的都是同一个实例。
属性在查找的时候是先查找自身的属性,若是没有再查找原型,再没有,再往上走,一直插到Object的原型上
hasOwnProperty是Object.prototype的一个方法,它但是个好东西,他能判断一个对象是否包含自定义属性而不是原型链上的属性,由于hasOwnProperty 是 JavaScript 中惟一一个处理属性可是不查找原型链的函数。