在AngularJS中实现对象工厂的最佳方法

在AngularJS中实现对象工厂的最佳方法,angularjs,coffeescript,Angularjs,Coffeescript,我在AngularJS中搜索对象的最佳方式。目标是像这样使用它model=newmodel'wowwowwow' 所以我从这个方法开始: app.factory 'Model', -> (blah) -> Model = blah: '' foo: [] Model.blah = blah Model 然后,我想在单独的函数中移动构造函数操作,这些操作将无法从类实例访问: app.factory 'Model', ->

我在AngularJS中搜索对象的最佳方式。目标是像这样使用它
model=newmodel'wowwowwow'

所以我从这个方法开始:

app.factory 'Model', ->
  (blah) ->
    Model =
      blah: ''
      foo: []
    Model.blah = blah
    Model
然后,我想在单独的函数中移动构造函数操作,这些操作将无法从类实例访问:

app.factory 'Model', ->
  constructor = (blah) ->
    @blah = blah
    @

  (blah) ->
    constructor.call
      blah: ''
      foo: []
最后,我想使用coffeescript的目标,并试图以一种显而易见的方式解决我的任务:

app.factory 'Model', ->
  class Model
    blah: ''
    foo: []
    constructor: (blah) ->
      @blah = blah
  (blah) ->
    new Model blah
但在最后一种情况下,它不能按需要工作:

var1 = new Model 'test'
var1.foo.push 'blah'
var2 = new Model 'asdasd'
console.log var2.foo
这里的问题是,创建后的var2将具有与var1相同的值(它们实际上是链接的)

是解决这个问题的关键

所以问题是

  • 我的第三种方法有什么问题

  • 如何更改第三种方法,使其与coffeescript的OOP功能一起工作

  • 对于我的任务有更好的方法吗


  • 在开始讨论a之后,Dean Sofer对angular的分类和子分类给出了很好的解释:

    对于您的问题,模型应定义为:

    app.factory 'Model', ->
      class Model
        constructor: (blah) ->
          @blah = blah
          @foo   = []
      (blah) ->
        new Model blah
    

    答复意见#4:


    @之所以这样做,是因为要将数组分配给原型,这有点类似于在Java类上使用静态字段

    每次推/弹出该阵列时,您都在使用共享原型阵列实例

    当您对字符串执行相同操作时,您不会操作共享实例,因为javascript字符串是不可变的。您所做的是将新字符串分配给对象实例(不再是原型)

    以下是幕后真正发生的事情:

    你的声明

    foo: []
    blah: ''
    
    转换为:

    Model.prototype.blah = '';
    Model.prototype.foo = [];
    
    操纵这些成员时,生成的代码(或多或少)是:

    您还可以通过以下方式获得您想要做的事情:

    a.foo = ['aaa']; // a.foo is a new independent array
    b.foo = ['bbb']; // b.foo is a new independent array
    
    但是这些
    foo
    s只是隐藏了原型,它仍然存在


    无论如何,也许您应该查找有关javascript原型继承的更多信息。

    我建议您在谷歌搜索“面向对象javascript”或“在javascript中创建类”或“原型继承”或类似内容。您将发现数百篇关于将OO概念应用于JS的优秀文章。JavaScript没有类的概念;我非常确信,试图将类的概念强加于JS会增加额外的复杂性,但好处却微乎其微。我知道JS中的OOP,问题是在AngularJS中使用它的最佳方式。我还知道JS没有类。更改了问题标题。谢谢。这对我真的很有帮助。然而,当这些对象中的数组变量链接到某个变量时,我仍然存在这个问题。请看到这种情况,因为您正在原型级别上分配foo。通过在构造函数中执行“@foo=[]”即可轻松修复。StackOverflow答案应提供实际内容;不链接到文章;因此,我建议你引用/复制文章中的相关段落并粘贴到你的答案中。请在此处阅读更多信息:@luismreis但为什么
    blah
    变量不发生这种情况?为什么只有数组会受到影响,从何处阅读?@设置这种情况是因为您将一个数组分配给原型,这有点类似于在Java上使用静态字段。
    a.foo = ['aaa']; // a.foo is a new independent array
    b.foo = ['bbb']; // b.foo is a new independent array