-
fn.prototype是什么
function fn(){} console.info(fn.prototype)是什么
0
-
Javascript的原型对象和prototype属性
Javascript中的继承机制是所谓的原型对象继承,通过属性访问机制的特殊性来实现继承的。 模拟创建对象: 用new操作符创建对象的时候javascript会做3件事: 首先是创建一个空对象(empty object), 然后对这个空对象的原型对象进行赋值, 最后把这个空对象赋值给构造函数的this属性且运行这个构造函数。 function Person(name) { this.name = name; } var p = new Person(); 相当于以下步骤: 1. var p = {}; 2. p.[[prototype]] = Person.prototype //这一步是伪代码,实际上一个对象的原型对象是不能通 过代码来访问的, 3. p.methodName = Person ; //这样的话Person的this就会指向p p.methodName(); 创建完一个空对象后,会初始化这个空对象的原型对象,javascript会把构造函数的一个叫做 prototype的属性所指向的对象赋值给当前空对象的原型对象。所有的function都有一个prototype属 性,当一个function被定义之后这个属性会被自动的创建和初始化。一个function 的prototype属性的 初始值是一个对象(an object),这个对象只有一个属性叫做constructor,而这个constructor 的值 就是当前这个函数(或者叫构造函数)。 function Person(name) { this.name = name; } Person === Person.prototype.constructor; //true 总结: 1. 所有的对象都有原型对象,但不是每个对象都有prototype属性。 2. prototype属性是函数(function)特有的属性。 3.函数(function)也是一个对象,那么它也有原型对象,它的原型对象和它的prototype属性没有任 何关系。 4.一个函数的原型对象是Function.prototype所指向的那个对象。因为所有的function都是Function的 实例,Function是所有funciton的构造函数,按照上面的定义,一个对象的原型对象是这个对象的构造 函数的prototype所指的那个对象。 function Person(name) { this.name = name; } var p = new Person(“Marry”); p 的原型对象是Person.prototype Person 的原型对象是Function.prototype Person.prototype.constructor === Person //true 继承的例子: function Person(name){ this.name = name; } Person.prototype.walk = function () { alert(“walking”); } function Author(){ } 现在有了Author,想要用Author创建出来的对象继承Person那么就把Author的prototype属性重新赋值 为一个Person对象 Author.prototype = new Person(); 然后赋值之后原来的Author.prototype.constructor 就不是原来的Author 所以还要 Author.prototype.construtor = Author
0
-
prototype与[[prototype]]的区别
Function 对象的prototype只是一个属性,而所有对象都有[[prototype]]是一个内部属性,记做 [[prototype]]。 内部属性是不能访问的,某些实现,如SpiderMonkey和JavaScriptCore,会有一个__proto__属性,基本上 可以看成是[[prototype]]。 对于function f来说,new f()所产生的新对象,其内建属性[[prototype]]的值会被赋值为f.prototype的 值。 __proto__属性是一个对象,则它也有__proto__,这样就构成了prototype链。 x.isPrototypeOf(y)可以检测x是否是y的prototype链上的一环。 严格的说,(根据ECMA-262规范),所有函数初始化后,都有一个prototype属性,其值为new Object()。
0