JavaScript中的“ new”关键字是什么?

JavaScript

飞云Tom小宇宙

2020-03-09

newJavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。

  • 它是什么?
  • 它解决什么问题?
  • 什么时候合适,什么时候不合适?

第228篇《JavaScript中的“ new”关键字是什么?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

8个回答
null 2020.03.09

new关键字是创建新的对象实例。是的,javascript是一种动态编程语言,它支持面向对象的编程范例。关于对象命名的约定是,对于应该由new关键字实例化的对象,始终使用大写字母。

obj = new Element();
村村小小十三 2020.03.09

new关键字改变正在运行在其下的功能的上下文和指针返回到该上下文。

当您不使用new关键字时,函数在其下Vehicle()运行的上下文与您从中调用该Vehicle函数的上下文相同this关键字将指向同一个语境。当您使用时new Vehicle(),会创建一个新上下文,因此this函数内的关键字引用了新上下文。作为回报,您将获得新创建的上下文。

L前端 2020.03.09

摘要:

new关键字以JavaScript用于创建从一个构造函数的对象。new关键字的构造函数调用之前放置,并会做以下几件事:

  1. 创建一个新对象
  2. 将此对象的原型设置为构造函数的prototype属性
  3. this关键字绑定到新创建的对象并执行构造函数
  4. 返回新创建的对象

例:

function Dog (age) {
  this.age = age;
}

const doggie = new Dog(12);

console.log(doggie);
console.log(doggie.__proto__ === Dog.prototype) // true

到底发生了什么:

  1. const doggie 说:我们需要内存来声明变量。
  2. 分配运算符=说:我们将使用=
  3. 表达式是new Dog(12)JS引擎看到new关键字,创建一个新对象并将原型设置为Dog.prototype
  4. 使用this设置为新对象执行构造函数在此步骤中,将年龄分配给新创建的小狗对象。
  5. 返回新创建的对象,并将其分配给变量doggie。
BB 2020.03.09

Javascript是一种动态编程语言,它支持面向对象的编程范例,并且用于创建对象的新实例。

类对于对象不是必需的-Javascript是一种基于原型的语言。

LEY理查德 2020.03.09

让初学者更好地了解它

在浏览器控制台中尝试以下代码。

function Foo() { 
    return this; 
}

var a = Foo();       //returns window object
var b = new Foo();   //returns empty object of foo

a instanceof Window;  // true
a instanceof Foo;     // false

b instanceof Window;  // false
b instanceof Foo;     // true

现在您可以阅读社区Wiki答案了:)

阿飞西门 2020.03.09

JavaScript 一种面向对象的编程语言,它完全用于创建实例。它是基于原型的,而不是基于类的,但这并不意味着它不是面向对象的。

逆天L 2020.03.09

假设您具有以下功能:

var Foo = function(){
  this.A = 1;
  this.B = 2;
};

如果您将其称为独立函数,例如:

Foo();

执行此功能将为window对象(AB添加两个属性window之所以将其添加到,是因为window这样执行时调用该函数的对象,而this在函数中是调用该函数的对象。至少在Javascript中。

现在,用这样的方式调用它new

var bar = new Foo();

当您添加new到函数调用中时,会发生一个新对象(只是var bar = new Object())的创建this并且函数内的指向Object刚创建的新对象,而不是指向调用该函数的对象。所以,bar现在与属性的对象AB任何函数都可以是构造函数,但这并不总是很有意义。

阳光逆天 2020.03.09

除了丹尼尔·霍华德(Daniel Howard)的答案,这是做什么的new(或者至少看起来是这样做的):

function New(func) {
    var res = {};
    if (func.prototype !== null) {
        res.__proto__ = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }
    return res;
}

var obj = New(A, 1, 2);

相当于

var obj = new A(1, 2);

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android