所有javaScirpt类都会有一个prototype属性,但是类实例没有。
在javascirpt中创建一个函数时,会执行1.为该函数添加一个原型(prototype)属性。2.为prototype对象额外添加一个constructor属性,并且该属性保存了指向函数F的一个引用。
下面来以创建函数为例:
//首先创建一个空函数,该函数默认会有一个prototype属性。且prototype属性拥有一个construct方法。vargxm=function(){}undefined//给函数的原型属性添加属性gxm.prototype.first="郭"'郭'gxm.prototype.last="晓梅"'晓梅'//函数对象本身不能获取prototype属性里面的值。gxm.firstundefinedgxm.lastundefined//创建一个函数的实例,此时函数就相当于一个构造器varg=newgxm()undefined//实例取值是取的prototype属性上的值g.first'郭'g.last'晓梅'gxm.constructorƒFunction(){[nativecode]}//函数prototype属性中的constructor方法就是指函数本身gxm.prototype.constructor===gxmtrue//函数prototype属性中的__proto__隐式原型是Object的prototype,Object.prototype.__proto__===null;gxm.prototype.__proto__===Object.prototypetrue//实例对象没有prototype属性,只有隐式原型__proto__,且指向函数的prototype属性;g.__proto__===gxm.prototypetrue//实例对象的构造函数,就是父函数本身g.constructor===gxmtrue
javascript中一切皆对象,函数也是一个对象,所以可以直接给函数定义变量,通过函数点取值的方式,取到的值是函数用点的方式赋值。
创建函数时,就会给函数添加一个prototype属性,通过prototype属性添加的方法和属性,可以通过实例对象获取得到。即实例对象用点获取的值是函数
函数实例对象没有prototype,只有proto 实例对象的属性是函数的this指向的对象。如果有返回对象就是返回的对象。否则就是this
函数实例对象用点赋值,并不会给原来函数的prototype增加属性值。
再来讲讲构造函数
构造器里面的this就是指返回的这个对象
如果构造器不显式的返回任何数据,或者返回一个非对象类型的数据(如字符串),this指向返回的这个对象
如果构造器显式的返回了一个对象,则实例化的结果会返回这个对象,而不是构造器中的this。
下面实践
varobjFn=function(){this.name="ch";this.school="yan"}undefinedvarobj=newobjFn()undefinedobjobjFn{name:'ch',school:'yan'}varobFn=function(){this.user="isme";return{add:"nc",watch:"sun"}}undefinedobFnƒ(){this.user="isme";return{add:"nc",watch:"sun"}}varob=newobFn()undefinedob{add:'nc',watch:'sun'}varod=function(){this.day="sunday";return"ilove"}undefinedodƒ(){this.day="sunday";return"ilove"}varo=newod()undefinedood{day:'sunday'}
综上实例对象出来的值是,函数中的this定义的属性和方法,或者是函数return返回的一个对象。
实例对象增加新属性,并不会给构造函数的prototype属性增添属性。