0

我正在构建一个应用程序,其中有一个 View,它是一个类,它需要一堆属性来显示、创建、更新等。

我这样设置我的视图

export default class {
   constructor(view) {
      this.id = view.id;
      this.title = view.title;
   }
}

我希望能够View在创建新视图时初始化 a,我认为正确的方法是这样的

let newView = new View()

不幸的是,如果我这样做,似乎不会调用构造函数。当我运行这个测试

expect(newView.id).toBe(undefined)

我得到一个错误cannot read property id of undefined

let newView = new View({})

返回正确,但我觉得提供一个空对象有点奇怪。这个对吗?有没有更好的方法来实例化一个空类?

4

2 回答 2

1

您可以使用默认参数将object 设置为具有属性view的默认变量标识符,设置为viewidtitleundefined

class View {
   constructor(view = {id: void 0, title: void 0}) {
      this.id = view.id; 
      this.title = view.title;
   }
}

var newView = new View();

console.assert(newView.id === undefined
              , {"message":"newView.id is not undefined"
              , "newView.id":newView.id}
);

console.assert(newView.id !== undefined
              , {"message":"newView.id is undefined"
              , "newView.id":newView.id}
);

console.dir(newView);

于 2016-10-10T06:17:29.840 回答
1

这是对的。

正在调用您的构造函数,但它是使用参数定义的。在您的第一次通话中,您传递空对象:

let newView = new View(); 

例外:

export default class {
   constructor(view) {   //view = 'undefined'
      this.id = view.id; //This line will cause exception.
      this.title = view.title;
   }
}

因此,您在构造函数中的参数“视图”将未定义,您将获得异常。

你打电话时:

let newView = new View({}); // new object {}

您的参数“视图”将被定义,您可以访问它的“道具”。(当然它们都将为空)

补充:不幸的是,构造函数没有重载,它们仍然像普通的 JS 函数一样工作,你可以做一个解决方法:

export default class {
   constructor(view) {  
      view = view || {}; //this is default value for param.
      this.id = view.id; 
      this.title = view.title;
   }
}

然后你就可以使用 new View() 和 new View({object})

于 2016-10-10T05:53:01.430 回答