免费行情软件网站大全网页版,制作招聘海报的app,公司网站seo优化的,西安网站建设 企业建站注意#xff1a;前方高能预警#xff0c;请认真仔细看完#xff0c;阅读完后自己再次画下原型图#xff0c;相信你一定会有更深刻的认识。(推荐炒鸡好用的画流程图的软件ProcessOn)构造函数#xff1a;function Foo ( ) { };实例对象#xff1a;let f1new Foo;let o1new …注意前方高能预警请认真仔细看完阅读完后自己再次画下原型图相信你一定会有更深刻的认识。(推荐炒鸡好用的画流程图的软件ProcessOn)构造函数function Foo ( ) { };实例对象let f1new Foo; let o1new Foo;每个函数都有 prototype 属性除了 Function.prototype.bind()该属性指向原型。每个对象都有 __proto__ 属性指向了创建该对象的构造函数的原型。其实这个属性指向了 [[prototype]]但是 [[prototype]] 是内部属性我们并不能访问到所以使用 _proto_ 来访问。对象可以通过 __proto__ 来寻找不属于该对象的属性__proto__ 将对象连接起来组成了原型链。下面我们来解释上图的原型图的含义概念1、构造函数用来初始化新创建的对象的函数是构造函数。在例子中Foo()函数是构造函数。2、实例对象通过构造函数的new操作创建的对象是实例对象。可以用一个构造函数构造多个实例对象。function Foo(){};
var f1 new Foo;
var f2 new Foo;
console.log(f1 f2);//false复制代码3、原型对象及prototype构造函数有一个prototype属性指向实例对象的原型对象。通过同一个构造函数实例化的多个对象具有相同的原型对象。经常使用原型对象来实现继承。function Foo(){};
Foo.prototype.a 1;
var f1 new Foo;
var f2 new Foo;console.log(Foo.prototype.a);//1
console.log(f1.a);//1
console.log(f2.a);//1复制代码4、constructor原型对象有一个constructor属性指向该原型对象对应的构造函数。由于实例对象可以继承原型对象的属性所以实例对象也拥有constructor属性同样指向原型对象对应的构造函数。console.log(Foo.prototype.constructor Foo);//true
console.log(f1.constructor Foo);//true复制代码5、_proto_实例对象有一个proto属性指向该实例对象对应的原型对象。console.log(f1.__proto__ Foo.prototype);//true复制代码概念介绍完了现在对图示的关系进行详细说明【第一部分 Foo】1、实例对象f1是通过构造函数Foo()的new操作创建的。构造函数Foo()的原型对象是Foo.prototype实例对象f1通过__proto__属性也指向原型对象Foo.prototype。console.log(f1.__proto Foo.prototype);//true
复制代码2、实例对象f1本身并没有constructor属性但它可以继承原型对象Foo.prototype的constructor属性console.log(Foo.prototype.constructor Foo);//true
console.log(f1.constructor Foo);//true
console.log(f1.hasOwnProperty(constructor));//false复制代码 下图是实例对象f1的控制台效果【第二部分 Object】1、Foo.prototype是f1的原型对象同时它也是实例对象。实际上任何对象都可以看做是通过Object()构造函数的new操作实例化的对象 所以Foo.prototype作为实例对象它的构造函数是Object()原型对象是Object.prototype。相应地构造函数Object()的prototype属 性指向原型对象Object.prototype实例对象Foo.prototype的proto属性同样指向原型对象Object.prototype。console.log(Foo.prototype.__proto__ Object.prototype);//true
复制代码2、实例对象Foo.prototype本身具有constructor属性所以它会覆盖继承自原型对象Object.prototype的constructor属性。console.log(Foo.prototype.constructor Foo);//true
console.log(Object.prototype.constructor Object);//true
console.log(Foo.prototype.hasOwnProperty(constructor));//true复制代码 下图是实例对象Foo.prototype的控制台效果3、如果Object.prototype作为实例对象的话其原型对象是什么结果是null。我以为这可能也是typeof null的结果是object的原因之一吧。console.log(Object.prototype.__proto__ null);//true
复制代码【第三部分 Function】1、前面已经介绍过函数也是对象只不过是具有特殊功能的对象而已。任何函数都可以看做是通过Function()构造函数的new操作实例化的结果。如果把函数Foo当成实例对象的话其构造函数是Function()其原型对象是Function.prototype类似地函数Object的构造函数也是Function()其原型对象是Function.prototype。console.log(Foo.__proto__ Function.prototype);//true
console.log(Object.__proto__ Function.prototype);//true复制代码2、原型对象Function.prototype的constructor属性指向构造函数Function()实例对象Object和Foo本身没有constructor属性需要继承原型对象Function.prototype的constructor属性。console.log(Function.prototype.constructor Function);//true
console.log(Foo.constructor Function);//true
console.log(Foo.hasOwnProperty(constructor));//false
console.log(Object.constructor Function);//true
console.log(Object.hasOwnProperty(constructor));//false
复制代码3、所有的函数都可以看成是构造函数Function()的new操作的实例化对象。那么Function可以看成是调用其自身的new操作的实例化的结果。所以如果Function作为实例对象其构造函数是Function其原型对象是Function.prototype。console.log(Function.__proto__ Function.prototype);//true
console.log(Function.prototype.constructor Function);//true
console.log(Function.prototype Function.prototype);//true复制代码4、如果Function.prototype作为实例对象的话其原型对象是什么呢和前面一样所有的对象都可以看成是Object()构造函数的new操作的实例化结果。所以Function.prototype的原型对象是Object.prototype其原型函数是Object()。console.log(Function.prototype.__proto__ Object.prototype);//true
复制代码总结【1】函数(Function也是函数)是new Function的结果所以函数可以作为实例对象其构造函数是Function()原型对象是Function.prototype。【2】对象(函数也是对象)是new Object的结果所以对象可以作为实例对象其构造函数是Object()原型对象是Object.prototype【3】Object.prototype的原型对象是null。