如何从一个对象添加和覆盖属性到另一个对象?

时间:2015-04-23 09:41:35

标签: actionscript-3 oop

我有一个简单的实用功能:

public static function extend(objA:Object, objB:Object):Object {
    objA = objA || {};
    for(var prop:String in objB) {
        if(typeof(objB[prop]) === "object") {
            objA[prop] = extend(objA[prop], objB[prop]);
        } else {
            objA[prop] = objB[prop];
        }
    }

    return objA;
}

我目前正在使用它:

object1 = {prop1: "asd", prop2: {subProp1: 120, subProp2: 360}};
object2 = {prop1: "asd", prop2: {subProp1: 120, subProp2: 5, subProp3: 6}};
object1 = extend(object1, object2);
//object1 now looks like (subProp2 overwritten, subProp3 added):
//{prop1: "asd", prop2: {subProp1: 120, subProp2: 5, subProp3: 6}};

我想像这样使用它:

object1 = {prop1: "asd", prop2: {subProp1: 120, subProp2: 360}};
object2 = {prop1: "asd", prop2: {subProp1: 120, subProp2: 5, subProp3: 6}};
object1.extend(object2);

很多资源都说AS原型设计不再是一个好主意。那么在AS3中实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

也许这会对你有所帮助: http://tobyho.com/2009/05/02/modifying-core-types-in/

但我建议您在AS3中避免使用该代码样式。这是你的代码:

Object.prototype.extend = function(objB:Object):Object {
            var objA:Object = this || {};
            for(var prop:String in objB) {
                if(typeof(objB[prop]) === "object") {
                    objA[prop].extend(objB[prop]);
                } else {
                    objA[prop] = objB[prop];
                }
            }

            return objA;
        }

答案 1 :(得分:0)

原型的问题在于它们正在向现有的“类”添加行为。

为什么那么糟糕?

  1. 没有人知道代码的哪些部分会为Object添加功能 类。阅读代码真是太可怕了,因为在某些时候会有代码 对Object的方法调用对你来说是全新的。
  2. 容易出现命名冲突。如果我想定义一个方法 extend上的Object,它会与您发生冲突。
  3. 您的问题没有明确答案,因为您的示例过于通用。通常,您不希望将此功能添加到所有对象,因为并非所有对象都需要它。而且您只想添加/覆盖某些属性。