js中constructor的作⽤
在学习过程中对js的constructor的作⽤产⽣了疑问。下⾯是学习的资料进⾏梳理
function Person(area){
this.area = area;
}
Person.prototype.sayArea = function(){
js原型和原型链的理解console.log(this.area);
}
var Father = function(age){
this.age = age;
}
Father.prototype = new Person('Beijin');
console.log(structor) //function person()
console.log(structor); //function person()
structor = Father; //修正
console.log(structor); //function father()
var one = new Father(25);
structor = Father,这⾥修正了的Father的constructor。我们知道prototype下的constructor属性返回对创建此对象的函数的引⽤。
⼀、不修正时
structor = function Function(),structor = function Person(),这⾥引出
⼀个题外话,为什么structor !== structor。
1. _proto_是所有对象(包括函数)都有的,它才叫做对象的原型,原型链就是靠它形成的。
2. prototype只有函数(准确地说是构造函数)才有的。它跟原型链没有关系。它的作⽤是:构造函数new对象的时候,告诉构造函数新创建的对象的原型是谁。
structor,是从Father的原型链查属性,也就是__proto__,因为Father继承的是Function(){},⽽Function(){}的constructor就是它⾃⼰
所以structor = function Function();
为什么structor 是 function Person(),⾸先Father.prototype = new Person('Beijin');当我们⽤new
运算符会产⽣以下步骤:
1. var obj={}; 也就是说,初始化⼀个对象obj。
2. obj.__proto__=a.prototype;
3. a.call(obj);也就是说构造obj,也可以称之为初始化obj。
也就是说(new Person('Beijin')).__proto__ === Person.prototype //true
前⾯我们说过new Person('Beijin')对象是没有prototype的,prototype只有函数才有;structor将会沿着new Person('Beijin')的
原型链向下查constructor,new Person('Beijin')没有constructor就去它的__proto__,因为(new Person('Beijin')).__proto__ === Person.prototype
⽽structor == function Person(),所以 structor == structor //function Person()
当我们var one = new Father(25)时 ,structor = structor,所以structor指向function Person(),
⼆、修正时
当我们加上structor = Father;对象one的原型链变成
显⽽易见,structor = structor = function Father();
三、作⽤
var man;
(function(){
function Father (name) {
this.name = name;
}
Father.prototype.sayName= function () {
console.log(this.name);
}
man = new Father('aoyo');
})()
man.sayName();//aoyo
console.log(Father); //Father is not defined
因为Father在闭包中,当我们想对Father类增加⽅法时可以通过
console.log(age);
}
man.sayAge('20'); //20
如果不进⾏修正,我们的⽅法将会添加到Person类,⽽不是Father类。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论