函数原型对象prototype,对象的构造器constructor,对象的[[Prototype]]对象(浏览器中表示为-proto-,下文统一使用-proto-),涉及到对象构造,继承等一些概念,总有些搞不清,总结记录一下。
一、构造函数
function Temp(a){
this.name = a;
}
var b = new Temp("小明")
当一个函数使用new操作符来调用的时候,说明该函数作为了构造函数。new操作符会做以下几个操作。
1、新建一个对象,这时就需要原型对象了,每一个函数都有一个默认的原型对象,函数的prototype属性保存了它的引用,也就是Temp.prototype属性指向这个对象,默认情况下,该对象继承自Object,只有一个constructor属性,该属性在函数被创建时指向函数自身。使用new操作符时,使用这个对象生成一个新的实例。该实例的-proto-属性指向这个对象。
2、将函数的作用域赋予这个对象,也就是函数的this指向这个对象。
3、执行函数体内的内容,比如为这个对象添加属性和方法。如示例中的this.name = a
4、返回这个新对象。
1.1 使用构造函数创建对象的实例
构造函数作为对象构造器,类似于“类”,适用于创建有属性,有方法的对象。
使用示例:
function Temp(a){
this.name = a;
}
//console.log(Temp.prototype) {constuctor:f Tmep(a),_proto_:Object}
Temp.prototype.saynam = function (name){
this.name = name
}
//console.log(Temp.prototype) {saynam:f (name),constuctor:f Tmep(a),_proto_:Object}
var b = new Temp("小明")
//console.log(b) Temp{name:"小明",_proto_:{saynam:f (name),constuctor:f Tmep(a),_proto_:Object}
对象原型中的属性和方法被所有实例共享,因此,一般在原型中设置方法,但属性在构造函数同设置,这个每个实例的属性就都是独立的。
除上述每个方法单独设置的方式外,也可以把所有的方法放在一个对象内设置。但一定要注意,不要忘了设置原型对象的constructor属性。
Temp.prototype = {
saynam:function (name){
this.name = name
},
getname:function (name){
return this.name
},
constructor:Temp
}