创建对象的几种方式
- new Object() 构造函数
// new Object()方法
var person = new Object();
person.name = "Bob";
person.age = 19;
person.sayName = function () {
console.log(this.name);
};
- 对象字面量 {}
// 对象字面量方法 简化 new Object()方法
var person = {
name: "Bob",
age: 18,
sayName: function () {
console.log(this.name);
}
};
- 工厂函数
函数名首字母不需大写,遵循驼峰命名
function createPerson(name, age) {
//添加一个新对象
var person = new Object();
person.name = name;
person.age = age;
person.sayName = function () {
console.log(this.name);
};
//必须设置返回值
return person;
}
//生成真正对象
var person1 =createPerson("bbb",23);
console.log(person1);
内部也可以使用字面量方式
function createPerson(name, age) {
//字面量方法添加一个新对象
//必须设置返回值
return {
name: name,
age: age,
sayName: function () {
console.log(this.name);
}
}
}
//生成真正对象
var person1 = createPerson("bbb", 23);
console.log(person1);
- 自定义构造函数
- 构造函数名首字母大写
- 通过构造函数生成的实例是可以找到自己当初的构造函数
- constructor属性值就是生成这个对象的构造函数,可以通过对象名打点调用这个属性来查看原本的构造函数
- 判断一个对象的具体对象类型还是需要用instanceof进行判断更加准确,返回值是true和false
console.log(person1 instanceof Person);
//自定义构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this.name);
};
}
//生成对象实例
var person1 = new Person("Bob", 25);
// new的作用
// 1. 在函数内部创建新对象
// 2. 将this指向新对象
// 3. 执行构造函数内部的新代码
// 4. 将新对象作为返回值
构造函数和实例对象的关系
- 构造函数是根据具体的事物抽象出来的抽象模板
- 实例对象是根据抽象的构造函数模板得到的具体实例对象
- 每一个实例对象都通过一个 constructor 属性,指向创建该实例的构造函数
注意:constructor 是实例的属性的说法不严谨,具体后面的原型会讲到 - 可以通过 constructor 属性判断实例和构造函数之间的关系
注意:这种方式不严谨,推荐使用 instanceof 操作符,后面学原型会解释为什么
静态成员和实例成员
- 使用构造函数方法创建对象时,可以给构造函数和创建的实例对象添加属性和方法,这些属性和方法都叫做成员。
- 实例成员:在构造函数内部添加给 this 的成员,属于实例对象的成员,在创建实例对象后必须由对象调用。
- 静态成员:添加给构造函数自身的成员,只能使用构造函数调用,不能使用生成的实例对象调用。
function Person(name, age) {
//实例成员,通过生成的实例来调用,创建时直接添加到函数内部
this.name = name;
this.age = age;
this.type = "human";
this.sayName = function () {
console.log(this.name);
};
}
//静态成员,直接给构造函数添加的成员
Person.version = "1.0";
var person1 = new Person("Bob", 34);
//实例成员调用,打印出的是Bob
console.log(person1.name);
// 使用构造函数调用,调用不成功,打印出的是函数自己的name
console.log(Person.name);
//静态成员使用构造函数调用可以成功,实例调用会失败,打印出undefinded
console.log(Person.version);
console.log(person1.version);
构造函数的问题
浪费内存:使用原型对象可以更好的解决构造函数的内存浪费问题。