js中new和object.creat区别

简介: 【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。

在JavaScript中,new 关键字和 Object.create() 方法都可以用于创建对象,但它们之间存在一些重要的区别:

语法和基本使用

  • new 关键字:使用 new 关键字创建对象时,需要先定义一个构造函数,然后通过 new 操作符调用该构造函数来创建一个新的对象实例。构造函数内部使用 this 关键字来初始化对象的属性和方法。例如:
function Person(name, age) {
   
  this.name = name;
  this.age = age;
  this.sayHello = function() {
   
    console.log('Hello, I am ' + this.name);
  };
}

var person1 = new Person('Alice', 25);
person1.sayHello();
  • Object.create() 方法Object.create() 方法接受一个对象作为参数,该参数对象将作为新创建对象的原型对象。新创建的对象会继承原型对象的属性和方法。例如:
var personProto = {
   
  sayHello: function() {
   
    console.log('Hello, I am ' + this.name);
  }
};

var person2 = Object.create(personProto);
person2.name = 'Bob';
person2.sayHello();

原型链继承方式

  • new 关键字:使用 new 关键字创建对象时,新对象的原型对象是构造函数的 prototype 属性所指向的对象。通过原型链继承,子类可以继承父类原型上的属性和方法。例如:
function Parent() {
   
  this.parentProperty = 'I am from parent';
}

Parent.prototype.parentMethod = function() {
   
  console.log('This is parent method');
};

function Child() {
   
  Parent.call(this);
  this.childProperty = 'I am from child';
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

var child = new Child();
console.log(child.parentProperty); 
console.log(child.childProperty); 
child.parentMethod();
  • Object.create() 方法:直接将指定的对象作为新创建对象的原型,实现了一种更为直接的原型继承方式。新对象可以直接访问和调用原型对象上的属性和方法。例如:
var parentObj = {
   
  parentProperty: 'I am from parent',
  parentMethod: function() {
   
    console.log('This is parent method');
  }
};

var childObj = Object.create(parentObj);
childObj.childProperty = 'I am from child';

console.log(childObj.parentProperty); 
console.log(childObj.childProperty); 
childObj.parentMethod();

对象属性的初始化

  • new 关键字:在使用 new 关键字创建对象时,构造函数会在创建对象实例时自动执行,通过 this 关键字可以方便地初始化对象的属性。每个通过 new 创建的对象实例都有自己独立的属性值,互不干扰。
function Car(model, year) {
   
  this.model = model;
  this.year = year;
}

var car1 = new Car('Toyota', 2020);
var car2 = new Car('Honda', 2021);

console.log(car1.model); 
console.log(car2.model);
  • Object.create() 方法:使用 Object.create() 创建对象时,对象的属性需要在创建之后手动进行初始化。如果原型对象上已经有一些默认的属性值,新创建的对象会继承这些属性值,并且可以根据需要进行修改。
var carProto = {
   
  model: 'Default Model',
  year: 2000
};

var car3 = Object.create(carProto);
car3.model = 'Ford';
car3.year = 2022;

console.log(car3.model); 
console.log(car3.year);

对构造函数的依赖

  • new 关键字:依赖于构造函数来创建对象,构造函数可以定义对象的初始化逻辑、属性和方法等。通过 new 操作符,可以创建多个具有相同结构和行为的对象实例。
  • Object.create() 方法:不依赖于构造函数,直接基于一个现有的对象来创建新的对象,更加灵活,可以根据不同的原型对象创建出具有不同继承关系和行为的对象。

适用场景

  • new 关键字:适用于需要创建多个具有相同类型和结构的对象实例的场景,如创建多个具有相同属性和方法的类实例。通过构造函数可以方便地对对象进行初始化和定制,并且可以实现基于原型链的继承。
  • Object.create() 方法:适用于需要基于某个现有对象创建一个具有相似结构或继承关系的新对象的场景,特别是在不需要定义构造函数或者想要更灵活地控制对象的原型链和属性继承时非常有用。

综上所述,new 关键字和 Object.create() 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。

相关文章
|
29天前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
26 1
|
1月前
|
设计模式
在实际开发中,什么时候应该使用 `new` 关键字,什么时候应该使用 `Object.create()` 方法?
【10月更文挑战第29天】`new` 关键字适用于创建具有特定类型和初始化逻辑的对象实例,以及实现基于原型链的继承;而 `Object.create()` 方法则适用于基于现有对象创建相似对象、避免构造函数的副作用、创建具有特定原型链的对象等场景。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象,以实现更高效、更灵活的代码结构。
|
2月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
108 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
2月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
21 2
|
2月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
43 3
|
2月前
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
35 0
|
3月前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
114 4
|
2月前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
100 20
|
4月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
下一篇
DataWorks