1,每个对象都有一个__proto__属性。
2,每个构造函数都有一个prototype的方法。
3,_proto_指向自身构造函数的prototype方法。
4,constructor 返回创建该对象的构造函数。
注:(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法,js中的函数也是对象。所以函数也带有__proto__属性。
1 // 构造函数 2 function Foo(y) { 3 // 构造函数将会以特定模式创建对象:被创建的对象都会有"y"属性 4 this.y = y; 5 } 6 // "Foo.prototype"存放了新建对象的原型引用 7 // 所以我们可以将之用于定义继承和共享属性或方法 8 // 所以,和上例一样,我们有了如下代码: 9 // 继承属性"x" 10 Foo.prototype.x = 250; 11 // 继承方法"calculate" 12 Foo.prototype.calculate = function(z) { 13 return this.x + this.y + z; 14 }; 15 // 使用foo模式创建 "b" and "c" 16 var b = new Foo(); 17 var c = new Foo(); 18 // 调用继承的方法 19 b.calculate(); // 20 c.calculate(); // 21 // 让我们看看是否使用了预期的属性 22 console.log( 23 b.__proto__ === Foo.prototype, // true 24 c.__proto__ === Foo.prototype, // true 25 // "Foo.prototype"自动创建了一个特殊的属性"constructor" 26 // 指向a的构造函数本身 27 // 实例"b"和"c"可以通过授权找到它并用以检测自己的构造函数 28 b.constructor === Foo, // true 29 c.constructor === Foo, // true 30 Foo.prototype.constructor === Foo, // true 31 b.calculate === b.__proto__.calculate, // true 32 b.__proto__.calculate === Foo.prototype.calculate // true 33 ); 34 35 36 // 字符串:String() 37 var str = "张三"; 38 console.log(str.constructor); // function String() { [native code] } 39 console.log(str.constructor === String); // true 40 // 数组:Array() 41 var arr = [1, 2, 3]; 42 console.log(arr.constructor); // function Array() { [native code] } 43 console.log(arr.constructor === Array); // true 44 // 数字:Number() 45 var num = 5; 46 console.log(num.constructor); // function Number() { [native code] } 47 console.log(num.constructor === Number); // true 48 // 自定义对象:Person() 49 function Person() { 50 this.name = "CodePlayer"; 51 } 52 var p = new Person(); 53 console.log(p.constructor); // function Person(){ this.name = "CodePlayer"; } 54 console.log(p.constructor === Person); // true 55 // JSON对象:Object() 56 var o = { 57 "name": "张三" 58 }; 59 console.log(o.constructor); // function Object() { [native code] } 60 console.log(o.constructor === Object); // true 61 // 自定义函数:Function() 62 function foo() { 63 alert("CodePlayer"); 64 } 65 console.log(foo.constructor); // function Function() { [native code] } 66 console.log(foo.constructor === Function); // true 67 // 函数的原型:bar() 68 function bar() { 69 alert("CodePlayer"); 70 } 71 console.log(bar.prototype.constructor); // function bar(){ alert("CodePlayer"); } 72 console.log(bar.prototype.constructor === bar); // true
1 function Fun(){ 2 } 3 // 我创造了一个函数Fn 4 // 这个函数由Function生成(Function作为构造函数) 5 var fn=new Fun() 6 // 我创建了一个函数fn 7 // 这个函数由Fn生成(Fn作为构造函数) 8 9 10 console.log(fn.__proto__===Fun.prototype) //true 11 // fn的__proto__指向其构造函数Fun的prototype 12 console.log(Fun.__proto__===Function.prototype) //true 13 // Fun的__proto__指向其构造函数Function的prototype 14 console.log(Function.__proto__===Function.prototype) //true 15 // Function的__proto__指向其构造函数Function的prototype 16 // 构造函数自身是一个函数,他是被自身构造的 17 console.log(Function.prototype.__proto__===Object.prototype) //true 18 // Function.prototype的__proto__指向其构造函数Object的prototype 19 // Function.prototype是一个对象,同样是一个方法,方法是函数,所以它必须有自己的构造函数也就是Object 20 console.log(Fun.prototype.__proto__===Object.prototype) //true 21 // 与上条相同 22 // 此处可以知道一点,所有构造函数的的prototype方法的__都指向__Object.prototype(除了....Object.prototype自身) 23 console.log(Object.__proto__===Function.prototype) //true 24 // Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype 25 console.log(Object.prototype.__proto__===null) //true 26 // Object.prototype作为一切的源头,他的__proto__是null 27 28 // 下面是一个新的,额外的例子 29 30 var obj={} 31 // 创建了一个obj 32 console.log(obj.__proto__===Object.prototype) //true 33 // obj作为一个直接以字面量创建的对象,所以obj__proto__直接指向了Object.prototype,而不需要经过Function了!! 34 35 // 下面是根据原型链延伸的内容 36 // 还有一个上文并未提到的constructor, constructor在原型链中,是作为对象prototypr的一个属性存在的,它指向构造函数(由于主要讲原型链,这个就没在意、); 37 38 console.log(obj.__proto__.__proto__===null) //true 39 console.log(obj.__proto__.constructor===Object) //true 40 console.log(obj.__proto__.constructor.__proto__===Function.prototype) //true 41 console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype) //true 42 console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null) //true 43 console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype) //true 44
代码转自两位大神的例子。谢谢了。此处存储
http://www.cnblogs.com/libin-1/p/6014925.html
http://www.jb51.net/article/74394.htm