Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript自定义类,是否有副作用?_Javascript - Fatal编程技术网

Javascript自定义类,是否有副作用?

Javascript自定义类,是否有副作用?,javascript,Javascript,我用下面的方法声明一个类并创建一个类对象,是否有副作用 // declare class Hero var Hero = { constructor: function(param) { return { id: param.id, name: param.name }; } }; // create a class object hero var hero = Hero.constructor({ id: 1, name: "Winds

我用下面的方法声明一个类并创建一个类对象,是否有副作用

// declare class Hero
var Hero = {
  constructor: function(param) {
    return {
      id: param.id,
      name: param.name
    };
  }
};

// create a class object hero
var hero = Hero.constructor({
  id: 1,
  name: "Windstorm"
});
代码显示没有特别的副作用

不过有几个注意事项:

  • 这不是JavaScript中通常使用的“类”。在JavaScript中,该术语与构造函数和相关原型相关。这过去只是惯例/常用用法,但ES2015(“ES6”)在语言中添加了
    class
    ,赋予了该术语在JavaScript中的特定含义

  • 您的
    Hero.constructor
    函数不是“constructor”函数,因为该术语在JavaScript中使用,它是一个工厂函数。JavaScript中的构造函数是通过
    new
    操作符调用的

  • 请注意,在ES2015及以上版本中,符号
    构造函数
    用于定义
    中的构造函数函数

这并不意味着你的代码是错误的。JavaScript是一种非常灵活的语言,在您的示例中使用它并没有什么错。只需指出术语,以免以后混淆

为了清楚起见,这里有一个ES5及更早版本中的等效
Hero
“class”,添加了
sayHello
方法来演示原型:

function Hero(param) {
    this.id = param.id;
    this.name = param.name;
}
Hero.prototype.sayHello = function() { // Or one might well use Object.defineProperty
    console.log("Hi, my name is " + this.name);
};

// Usage
var hero = new Hero({
  id: 1,
  name: "Windstorm"
});
这是ES2015+中的一个类:

class Hero {
    constructor(param) {
        this.id = param.id;
        this.name = param.name;
    }
    sayHello() {
        console.log("Hi, my name is " + this.name);
        // or with ES2015's templates:
        //console.log(`Hi, my name is ${this.name}`);
    }
}

// Usage
var hero = new Hero({
  id: 1,
  name: "Windstorm"
});
代码显示没有特别的副作用

不过有几个注意事项:

  • 这不是JavaScript中通常使用的“类”。在JavaScript中,该术语与构造函数和相关原型相关。这过去只是惯例/常用用法,但ES2015(“ES6”)在语言中添加了
    class
    ,赋予了该术语在JavaScript中的特定含义

  • 您的
    Hero.constructor
    函数不是“constructor”函数,因为该术语在JavaScript中使用,它是一个工厂函数。JavaScript中的构造函数是通过
    new
    操作符调用的

  • 请注意,在ES2015及以上版本中,符号
    构造函数
    用于定义
    中的构造函数函数

这并不意味着你的代码是错误的。JavaScript是一种非常灵活的语言,在您的示例中使用它并没有什么错。只需指出术语,以免以后混淆

为了清楚起见,这里有一个ES5及更早版本中的等效
Hero
“class”,添加了
sayHello
方法来演示原型:

function Hero(param) {
    this.id = param.id;
    this.name = param.name;
}
Hero.prototype.sayHello = function() { // Or one might well use Object.defineProperty
    console.log("Hi, my name is " + this.name);
};

// Usage
var hero = new Hero({
  id: 1,
  name: "Windstorm"
});
这是ES2015+中的一个类:

class Hero {
    constructor(param) {
        this.id = param.id;
        this.name = param.name;
    }
    sayHello() {
        console.log("Hi, my name is " + this.name);
        // or with ES2015's templates:
        //console.log(`Hi, my name is ${this.name}`);
    }
}

// Usage
var hero = new Hero({
  id: 1,
  name: "Windstorm"
});

没有副作用。您有一个函数,在给定相同的输入时总是返回相同的结果。我将使用const hero..@Thalaivar:True,但上面的代码似乎是ES5,而不是ES2015+。例如,在ES2015+中,
constructor:function()
可以是
constructor()
。您可以将
Hero.constructor
重命名为类似
create
的名称,以避免混淆。这很有用!谢谢,没有副作用。您有一个函数,在给定相同的输入时总是返回相同的结果。我将使用const hero..@Thalaivar:True,但上面的代码似乎是ES5,而不是ES2015+。例如,在ES2015+中,
constructor:function()
可以是
constructor()
。您可以将
Hero.constructor
重命名为类似
create
的名称,以避免混淆。这很有用!谢谢。我一直期待着这些答案。我一直期待着这些答案。