如何使用原型创建原始包装器对象

时间:2014-11-24 02:54:11

标签: javascript object prototype

我可以在对象中包装原语:

> p = Object(1);
< Number {[[PrimitiveValue]]: 1}

让我在其上设置属性:

> p.prop = 2;
> p.prop
< 2

,同时仍然使用原始对象:

> p + 1
< 2

我想用原型方法装饰这种原始包装对象。我知道我可以用以下方式明确设置原型:

> Object.setPrototypeOf(p, { q : 3 });
< Number {prop: 2, q: 3, [[PrimitiveValue]]: 1}

有没有办法用原型创建包装器对象,所以我不必在每个新创建的包装器上设置它(或污染Object原型)?也许通过创建一个ObjectWrapper,它将起作用:

> ObjectWrapper = ...???...
> ObjectWrapper.prototype = { q : 3 };
> [new] ObjectWrapper(1)

我想要产生

< Number {q:3, [[PrimitiveValue]]: 1}function

2 个答案:

答案 0 :(得分:0)

您可以使用此结构......

//outer function is to provide support for multiple wrappers with different inheritance
function PrimitiveWrapper(){
        return function(x){
            this.valueOf = function(){
                return x;
            }
        };
    };

var wrapper1 = PrimitiveWrapper();
wrapper1.prototype.p = 3;
var w11 = new wrapper1(1);
var w12 = new wrapper1(2);

var wrapper2 = PrimitiveWrapper();
var w21 = new wrapper2(1);

console.log(w11+3); //4
console.log(w11.p); //3
console.log(w12+3); //5
console.log(w12.p); //3

console.log(w21+3); //4
console.log(w21.p); //undefined

答案 1 :(得分:0)

这对你有用吗?您创建了一个ObjectWrapperCreator,它为您提供了一个可以调用的函数,例如:

function ObjectWrapperCreator(prototype) {

    var wrapper = function(param) {
        prototype.param = param;
        var obj = Object(param);
        Object.setPrototypeOf(obj, prototype);
        obj.valueOf = function() {
            return this.param;
        };
        return obj;
    };
    return wrapper;
}

Usage:
  var b = ObjectWrapperCreator({p: 1});
  var c = b(4);
  >> c + 1