构造函数
定义:通过 new 函数名 来实例化对象的函数叫构造函数。任何的函数都可以作为构造函数存在。之所以有构造函数与普通函数之分,主要从功能上进行区别的,构造函数的主要 功能为 初始化对象,特点是和new 一起使用。new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法。构造函数定义时首字母大写(规范)。
对new理解:new 申请内存, 创建对象,当调用new时,后台会隐式执行new Object()创建对象。所以,通过new创建的字符串、数字是引用类型,而是非值类型。
构造函数存在浪费内存问题,每个实例的复杂数据类型都开辟一块内存空间,既浪费时间又浪费内存
构造函数与ES6 类的区别
通过class定义的类和通过构造函数定义的类二者本质相同。并且在js执行时,会将第一种转会为第二种执行。所以 ES6 class的写法实质就是构造函数。
类
class Person{
//定义一个名字为Person的类
constructor(name,age){
//constructor是一个构造方法,用来接收参数
this.name = name; //this代表实例对象
this.age = age;
}
say(){
//这是一个类的方法,注意千万不要加上function
return this.name + this.age
}
}
var obj = new Person('老铁',18);
console.log(obj.say());
构造函数
function Person(name,age){
//构造函数和实例化构造名相同且大写(非强制,但这么写有助于区分构造函数和普通函数)
if(!(this instanceof Person)){
//避免使用者不小心讲Person当作普通函数执行
throw new Error(''请使用 new Person"); //仿ES6 class 中的写法
}
this.name = name;
this.age = age;
}
Person.prototype.say = function(){
return this.name + this.age
}
var obj = new Person('老铁',18); //通过构造函数创建对象,必须使用new运算符
console.log(obj.say());
成员
function Star(uname, age) {
this.uname = uname;
this.age = age;
this.sing = function() {
console.log('我会唱歌');
}
}
Star.sex = '男';
var ldh = new Star('刘德华', 18);
实例成员
// 1.实例成员就是构造函数内部通过this添加的成员 uname age sing 就是实例成员
// 实例成员只能通过实例化的对象来访问
console.log(ldh.uname);
ldh.sing();
// console.log(Star.uname); // 不可以通过构造函数来访问实例成员
静态成员
// 静态成员只能通过构造函数来访问
console.log(Star.sex);
console.log(ldh.sex); // 不能通过对象来访问
原型对象 prototype (共享方法)
为解决构造函数内存浪费问题,一般情况下,我们的公共属性定义到构造函数里面, 公共的方法我们放到原型对象身上
// 1. 构造函数的问题.
function Star(uname, age) {
this.uname = uname;
this.age = age;
// this.sing = function