首页 > 解决方案 > 在使用工厂函数创建的对象的属性中切换 true 或 false

问题描述

我曾经有这个构造函数和一个可以在真假之间切换 object.status 的原型。这里:

function Book(title, author, length, status){
    this.title = title;
    this.author = author;
    this.length = length;
    this.status = status;
}

Book.prototype.toggleStatus = function (){
    this.status = !this.status;
}

现在我想在工厂函数中创建原型。据我所知,这是:

const Book = function (title, author, length, status) {

            const toggleStatus = () => status = !status

           return {title, author, length, status, toggleStatus}

如果我调用 someObject.toggleStatus() 我在日志上收到反转的布尔状态,但它不会改变对象本身的 kvp 上的值,这是我的最终目标如果可能的话,我希望使用原型制作。

标签: javascript

解决方案


让处理程序重新分配返回对象的属性:

const Book = function (title, author, length, status) {
  const book = { title, author, length, status, toggleStatus: () => book.status = !book.status };
  return book;
};

另一个更接近于在闭包内重新分配变量名称的原始代码的选项(更奇怪)是制作status一个吸气剂:

const Book = function (title, author, length, status) {
  return {
    title,
    author,
    length,
    get status() {
      return status;
    },
    // add a setter too if needed
    toggleStatus: () => status = !status
  };
};

如果除了工厂函数之外还想使用原型,请使用Object.create从原型创建实例:

const Book = function (title, author, length, status) {
  const b = Object.create(bookProto);
  return Object.assign(b, { title, author, length, status });
};
const bookProto = {
  toggleStatus() {
    this.status = !this.status;
  }
};

const b = Book('title', 'author', 7, true);
console.log(b.status);
b.toggleStatus();
console.log(b.status);
b.toggleStatus();
console.log(b.status);
b.toggleStatus();


推荐阅读