JavaScript包含三部分:ECMAScript、DOM、BOM
ECMAScript提供了核心语言功能,面向对象,但是没有类的概念。本篇文章要总结一下创建对象的几种方式。如果面试官问你如果创建对象,你可以把它们都说一遍= = 。为了不那么累,还是说最好的方法吧。
1.创建Object的实例(最简单)
//使用new操作符,也就是Object构造函数的方法。
var person = new Object();
person.name ="panda";
person.sayName = function(){
alert(this.name);
};
//对象字面量的方法1
var person = {
name:"panda",
sayName:function(){
alert(this.name);
}
}
//对象字面量的方法2
var person = {};
person.name ="panda";
person.sayName = function(){
alert(this.name);
};
2. 工厂模式(不能识别对象类型)
工厂模式就是把1中的方法封装起来。
function createPerson(name){
var person = new Object();
person.name = "panda";
person.sayName=function(){
alert(this.name);
};
return person;
}
var person1 = createPerson("panda");
3. 构造函数模式
受new Object的启发,也可以new一个自定义的构造函数Person
//缺点:每个方法都要在每个实例上重新创建一遍
function Person(name){
this.name = name;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("panda1");
var person2 = new Person("panda2");
//缺点:封装性不好
function Person(name){
this.name = name;
this.sayName = sayName;
}
function sayName(){
alert(this.name);
};
var person1 = new Person("panda");
4. 寄生构造函数模式(不能确定对象类型)
和工厂模式比较相像。
function createPerson(name){
var person = new Object();
person.name = "panda";
person.sayName=function(){
alert(this.name);
};
return person;
}
var person1 = new Person("panda");//注意看这里
5. 稳妥构造函数模式(安全)
和工厂模式比较相像。
function createPerson(name){
var person = new Object();
person.name = "panda";
person.sayName=function(){
alert(this.name);
};
return person;
}
var person1 = Person("panda");//注意看这里
6. 原型模式(不适合引用类型的属性值)
原型模式构造出来的对象,对象拥有的属性和方法由所有实例共享。
function Person(){
}
Person.prototype.name = "panda";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
//重写原型对象,这种写法的construction属性变成了Object
function Person(){
}
Person.prototype= {
name:"panda",
sayName:function(){
alert(this.name);
}
};
7.构造函数和原型混合模式(最常用)
属性在构造函数中定义
方法在原型中定义
function Person(name){
this.name = name;
}
Person.prototype = {
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1 = new Person("panda");
8.动态原型模式(可以确定对象类型)
function Person(name){
this.name = name;
//方法
if(typeof this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}
var person1 = new Person("panda");