【问题标题】:How to achieve Observable behaviour in vanila js如何在 vanilla js 中实现 Observable 行为
【发布时间】:2018-12-19 00:44:19
【问题描述】:

我正在尝试在 vanila js 中实现淘汰观察计算行为

在 react 中,您将拥有这两个状态变量并计算全名

我们如何在 vanila js 中实现同样的效果

function person(firstname,lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.fullName = `${this.firstname}${this.lastname}`
}

var person1 =new person("abc","k");
Object.defineProperty(person,'firstname',{

  get: () => {
      return person1['firstname'];
  },
  set: (name) => {
      person1['firstname'] = name;
  }
  
});
Object.defineProperty(person,'lastname',{

  get: () => {
      return person1['lastname'];
  },
  set: (name) => {
      person1['lastname'] = name;
  }
});

Object.defineProperty(person,'fullName',{
  
  get: () => { 
    return `${person1['firstname']}-${person1['lastname']}`;
  }
  
});
console.log(person1.firstname, "firstnmae");
person1.firstname ="sah";
console.log(person1.lastname, "lastname");
console.log(person1.fullName, "fullname");

【问题讨论】:

  • 但我希望它能够影响我们对名字和姓氏所做的更改

标签: javascript oop observable prototype


【解决方案1】:

看看这段代码:

var person = {

    firstname: 'abc',
    lastname: 'k'

};

Object.defineProperty(person,'fullName',{
  
    get: function() {
    
        return `${this['firstname']}-${this['lastname']}`;
    
    }

});

var person1 = Object.create( person );

console.log(person1.firstname, "firstnmae");
person1.firstname ="sah";
console.log(person1.lastname, "lastname");
console.log(person1.fullName, "fullname");
  1. 没有必要通过.defineProperty 定义firstnamelastname,因为这些settergetter 将在您编写它们时默认工作。

  2. 你应该使用这个语法,因为它之后更容易阅读/维护,否则,如果你想坚持那个 constructor 语法,你去:

var person = function() {};

Object.defineProperty(person,'firstname',{

    value: 'abc',
    writable: true

});

Object.defineProperty(person,'lastname',{

    value: 'k',
    writable: true

});

Object.defineProperty(person,'fullName',{
  
    get: function() {
    
        return `${this['firstname']}-${this['lastname']}`;
    
    }

});

var person1 = Object.create( person );

console.log(person1.firstname, "firstnmae");
person1.firstname ="sah";
console.log(person1.lastname, "lastname");
console.log(person1.fullName, "fullname");
  1. 我认为您需要对Object.create() and MDN is the best place进行更多调查。

  2. arrow-functions词法 this,小心!

  3. 这个语法可能会为你澄清一些关于Object.create()的观点:

var person = function() {};

person.prototype.firstname = 'abc';
person.prototype.lastname = 'k';

Object.defineProperty(person.prototype,'fullName',{
  
    get: function() {
    
        return `${this['firstname']}-${this['lastname']}`;
    
    }

});

var person1 = Object.create( person.prototype );

console.log(person1.firstname, "firstnmae");
person1.firstname ="sah";
console.log(person1.lastname, "lastname");
console.log(person1.fullName, "fullname");

【讨论】:

  • @Geeky 很高兴它有帮助
  • 这一切都很好,因为OOLO 的设计比prototypal 更易于维护。但是,writable 属性默认为true,因此无需重写。 :) 很好的解释
  • @BasheerAhmedKharoti 谢谢*OOLO 代表什么?但是writable is false by default
  • @mrReiha 我为错误的信息道歉,但它是 OLOO 那代表 Object Linked to Other Objects
  • @BasheerAhmedKharoti 没问题 OLOO tho xD
猜你喜欢
  • 2019-01-07
  • 2021-06-22
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2015-05-31
  • 2018-07-26
  • 1970-01-01
相关资源
最近更新 更多