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