前端面常见面试题之构造函数constructor
废话不多说,直接上代码
function User(username,age,sex){
this.username = username;
this.age = age;
this.sex = sex;
//以往直接写的方法,会造成内存浪费
//this.skill = function(){
// console.log('阿泽快乐敲代码');
//}
}
//使用prototype来实现共享,减少内存消耗
User.prototype.skill = function(){
console.log('阿泽快乐敲代码');
}
var aze = new User('可乐阿泽',24,'男');
var cola = new User('可乐',20,'女');
console.log(User.prototype);
console.log(aze.__proto__);//发现这两者的输出结果是一样的
console.log(User.prototype.constructor);
console.log(aze.__proto__.constructor);//会发现指向是没有错误的,依旧输出一样的内容。
但是我们常常需要修改constructor来满足我们的需求
比如说:
function User(username,age,sex){
this.username = username;
this.age = age;
this.sex = sex;
//以往直接写的方法,会造成内存浪费
//this.skill = function(){
// console.log('阿泽快乐敲代码');
//}
}
//使用prototype来实现共享,减少内存消耗
User.prototype = {
constructor:User,//指回原来的构造函数,不然我们的整个原型对象被覆盖,控制器后台看不到constructor。
dance: function(){
console.log('阿泽会跳舞')
},
coding: function(){
console.log('阿泽会coding')
}
}
var aze = new User('可乐阿泽',24,'男');
var cola = new User('可乐',20,'女');
console.log(User.prototype);
console.log(aze.__proto__);//发现这两者的输出结果都有constructor
console.log(User.prototype.constructor);
console.log(aze.__proto__.constructor);//会发现指向的是原来的构造函数
总结:如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动利用constructor指回原来的构造函数。
就是这样: