在类中转换对象

Javascript - transform object in class

本文关键字:对象 转换      更新时间:2023-09-26

我是JS的新手,我习惯了传统的面向对象语言,所以我很难让一些事情正常工作。

下面是我的例子:

var myObject = {
prop:'something'; 
callme:function () {
  console.log('you called me');
  }
}
firstObj = myObject;
firstObj.prop1 = 'new thing';
secondObj = myObject;
secondObj.prop1 = 'second thing';

显然'secondObj'覆盖了'fristObj'之前做的。我如何转换'myObject'对象,使它可以像一个类一样工作,所以我可以创建它的单独的新实例?

谢谢!

要在javascript中创建一个'class',你需要创建一个函数,按照惯例它的第一个字符大写。

function MyClass() { }
var obj = new MyClass();

要将方法附加到此,请将其添加到MyClassprototype

MyClass.prototype.callme = function () {
  console.log('you called me');
}

要添加属性,使用this来引用这个类的实例。

function MyClass() { 
  this.prop = 'something';
}

所以所有在一起:

function MyClass() { 
  this.prop = 'something';
}
MyClass.prototype.callme = function () {
  console.log('you called me');
}
// Remember to use var to declare variables (or they are global)
var firstObj = new MyClass();
firstObj.prop = 'new thing';
var secondObj = new MyClass();
secondObj.prop = 'second thing';

有一种JS编程风格,你只需要创建对象和返回对象的函数。在您的示例中,将myObject转换为返回散列的函数。每次调用它都会返回一个新的。

var myObject = function() {
  return {
    prop: 'something'; 
    callme: function () {
      console.log('you called me and prop is', this.prop);
    }
  };
}
firstObj = myObject();
firstObj.prop1 = 'new thing';
firstObj.callme();
secondObj = myObject();
secondObj.prop1 = 'second thing';
secondObj.callme();

除了你已经得到的两个很好的答案,我想指出的是,如果你准备使用边缘的东西,ES6,下一个JavaScript规范,包括类。

使用像babel这样的转译器,你已经可以编写ES6代码,然后编译它,使它可以在所有浏览器上运行。它的工作效果非常好,特别是当与webpack等工具结合使用时,这些工具可以使流程自动化,并培养出越来越多的行家。这是未来,显然是更糟糕的尝试(类只是冰山一角)。

你可以在这里阅读更多关于ES6类的信息。下面是他们给出的一个例子:

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  get area() {
    return this.calcArea()
  }
  calcArea() {
    return this.height * this.width;
  }
}

对实际问题的理论回答。在面向对象方面,JavaScript比大多数当前的面向对象语言更传统(例如SmallTalk——JavaScript的祖先之一)。它是基于原型的,这意味着对象从其他对象继承。为了典型的OOP类模仿,构造函数是一个令人不快的遗留(也称为"经典继承")(在某种程度上,class只是最流行的OOP中对象的结构,典型的JavaScript对象是其他对象的结构)。类似的例子可以是Io语言(为了简单而给出)。在我看来,没有必要像class这样单独的物体织物。