1.new对象
优点:通过构造函数创建对象实例。
缺点:构造函数内部的方法和属性无法被共享。
// 定义一个构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// 使用 new 关键字创建对象
let person1 = new Person("Alice", 30);
let person2 = new Person("Bob", 25);
// 输出对象的属性
console.log(person1.name); // 输出 "Alice"
console.log(person2.name); // 输出 "Bob"
2.字面量
优点:直观、简洁。
缺点:无法实现复用,每次都需要重新定义对象。
// 使用对象字面量方式创建对象
let person = {
name: "Alice",
age: 30,
greet: function() {
console.log("Hello, my name is " + this.name);
}
};
// 访问对象的属性和方法
console.log(person.name); // 输出 "Alice"
console.log(person.age); // 输出 30
person.greet(); // 输出 "Hello, my name is Alice"
3.工厂模式
优点:可以根据参数动态创建不同的对象。
缺点:无法识别对象类型,无法确定对象的原型。
function createPerson(name, age) {
return {
name: name,
age: age,
greet: function() {
console.log("Hello, my name is " + this.name);
}
};
}
let person1 = createPerson("Alice", 30);
let person2 = createPerson("Bob", 25);
person1.greet(); // 输出 "Hello, my name is Alice"
person2.greet(); // 输出 "Hello, my name is Bob"
4.构造函数
优点:可以创建特定类型的对象实例。
缺点:每个实例都有自己的方法拷贝,占用内存较多;不能继承父类的方法。
function Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log("Hello, my name is " + this.name);
};
}
let person1 = new Person("Alice", 30);
let person2 = new Person("Bob", 25);
person1.greet(); // 输出 "Hello, my name is Alice"
person2.greet(); // 输出 "Hello, my name is Bob"
5.原型对象
优点:实现了属性和方法的共享,节省内存空间。
缺点:会导致所有实例共享原型对象的属性,存在属性共享的问题。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log("Hello, my name is " + this.name);
};
let person1 = new Person("Alice", 30);
let person2 = new Person("Bob", 25);
person1.greet(); // 输出 "Hello, my name is Alice"
person2.greet(); // 输出 "Hello, my name is Bob"
5.1原型链
优点:简单易懂,实现了属性和方法的共享,节省内存空间。
缺点:所有实例共享同一个原型对象,无法向父类传递参数。
// 定义一个构造函数
function Person(name) {
this.name = name;
}
// 在构造函数的原型上添加方法
Person.prototype.greet = function() {
console.log("Hello, my name is " + this.name);
};
// 创建一个实例对象
let person = new Person("Alice");
// 访问实例对象的属性和方法
console.log(person.name); // 输出 "Alice"
person.greet(); // 输出 "Hello, my name is Alice"
// 原型链示例
console.log(person.toString()); // 从 Object 原型链上继承的方法
6.组合继承
优点:结合了构造函数继承和原型链继承的优点,避免了它们各自的缺点,实现了属性和方法的有效继承。
缺点:会调用两次父类构造函数,可能存在性能问题。
function Person(name) {
this.name = name;
}
Person.prototype.show=function(){
alert(this.name);
}
function Women() {
Person.call(this,"zhangsan"); // 只能继承实例属性 能解决 引用类型共享变量问题
}
Women.prototype=new Person(); //解决 方法继承的问题
var a = new Women();
a.show();
- 可以根据自己的需要选择不同的方式
- 今天也是努力的一天呢!