JS自定义创建对象的方式

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();
  • 可以根据自己的需要选择不同的方式
  • 今天也是努力的一天呢!
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值