javascript - 如何在 vanilla js 中实现 Observable 行为

标签 javascript oop observable prototype

我正在尝试在 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");

最佳答案

看看这段代码:

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. 无需定义 firstnamelastname通过.defineProperty因为这些 settergetter 将在您编写它们时默认工作。

  2. 您应该使用此语法,因为以后更容易阅读/维护,否则,如果您想坚持使用构造函数语法,请执行以下操作:

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");

  • 我认为您需要对 Object.create() and MDN is the best place 进行更多调查.

  • arrow-functions词汇 this ,小心!

  • 这个语法可能澄清了关于 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");

    关于javascript - 如何在 vanilla js 中实现 Observable 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53843117/

    相关文章:

    javascript - 更好的设计,以便从对象的方法中引用自己对象的属性

    Python - 循环上的多个实例

    android - 我如何使用 RXJava/Android 更改对象列表中的字段

    java - 如何将 observableset 转换为 observablelist

    angular - combineLatest 抛出 TypeError

    JavaScript 库/技巧缩放以适应视口(viewport)的页面内容?

    javascript - 给定 activeElement tabIndex,如何在 keydown 或 keyup 上设置 tabIndex?

    javascript - 减少加载大哈希表的正确方法

    javascript - CustomFieldValidator ClientValidationFunction 未触发且没有错误

    oop - 同时拥有抽象类和接口(interface)有什么好处吗?