如何使用object.assign()从其他对象引用基本对象属性

How to reference base object properties from other objects using Object.assign()

本文关键字:对象引用 对象 属性 其他 object 何使用 assign      更新时间:2023-09-26

我试图遵循Kyle Simpson的想法,即只使用对象而不使用函数进行实际的原型继承。我想看看我是否可以使用Object.create和Object.assign向对象添加mixin,这完全有效。然后,我尝试更进一步,将mixin中属性的一些值建立在基础对象中属性的值的基础上。我总是因为我试图与之合作的价值而得到NaN。这是代码:

function generatorFactory() {
    var basePlayer = {
        x: 0,
        y: 0,
        baseHealth: 50
    };
    var generatePlayer = function() {
        return basePlayer;
    };
    return generatePlayer;
}
var playerGenerator = generatorFactory();
var basicPlayerObject = playerGenerator();
var heavyArmor = {
    defense: 15,
    attack: 9
};
var lightArmor = {
    defense: 7
};
var swordsman = {
    health: this.baseHealth + 10
};
var knifeFighter = {
    health: this.baseHealth - 10
};
var sigurd = Object.assign(Object.create(basicPlayerObject), heavyArmor, swordsman);
console.log(sigurd.health);
console.log(sigurd.defense);
console.log(sigurd.attack);
console.log("Player coordinates: (" + sigurd.x + ", " + sigurd.y +")");

我想让剑客混装调整玩家的基础健康。我试着用"this",但无济于事。我开始觉得我完全错了。我到底做错了什么?

问题在于使用this的方式。当您定义一个对象时,this仍然指周围的范围,而不是您定义的新对象:

var self = this;
var swordsman = {
    checkThis: self === this // true
};

实现您想要做的事情的一种方法是将这些对象更改为函数。

function initSwordsman(obj) {
    obj.health = obj.baseHealth + 10;
}
var sigurd = Object.assign(Object.create(basicPlayerObject), heavyArmor);
initSwordsman(sigurd);

对象文字中的this没有引用您所期望的内容。如果您希望它动态引用访问属性的对象,则需要使用getter:

var swordsman = {
    health: {
        get() { return this.baseHealth + 10; },
        enumerable: true,
        configurable: true
    }
};
var knifeFighter = {
    health: {
        get() { this.baseHealth - 10 },
        enumerable: true,
        configurable: true
    }
};

并且需要将这些属性描述符传递给Object.create而不是Object.assign:

var sigurd = Object.assign(Object.create(basicPlayerObject, swordsman), heavyArmor);