对象的价值和原型问题

时间:2012-06-01 01:40:27

标签: javascript

我正在尝试创建一个新类,但它似乎不起作用。这是代码:

<script>
var myClass = function(arg){
    return new init(arg);
}
var init = function(arg){
    return arg;
}
init.prototype.prop = true;
</script>

问题是myClass('foo')未按预期返回'foo'。相反,它返回init。 然后我尝试了这段代码:

var init = function(arg){
    return [arg];//Now init returns an array
}

myClass('foo')会返回['foo'],但myClass('foo').prop会变为undefined。有谁知道如何解决它?

编辑:我想像jQuery一样或多或少地创建这个类。 例如:$('div')直接返回一个值(如果是所有div标签),但不是具有存储此值的属性的对象

4 个答案:

答案 0 :(得分:4)

当您致电new init()并在init()内返回非对象时,会产生init的实例,而不是返回的值。

如果从init()函数返回一个数组,则会返回该数组;但是Array没有考虑你的init原型:)

另请参阅:https://stackoverflow.com/a/1978474/1338292

如果你想成为一个数组,你可以这样做:

function myClass(arg) {
    return new init(arg);
}
function init(arg) {
    this.push(arg);
}
init.prototype = [];
init.prototype.foo = true;

var x = new init('foo');
console.log(x) // ["foo"]
console.log(x.foo) // true

它使init继承自Array原型(即[])。之后,您可以根据需要向init原型添加更多属性和方法。

答案 1 :(得分:3)

在你的代码中:

> <script>
> var myClass = function(arg) {
>   return new init(arg);
> }
> var init = function(arg){
>   return arg;
> }
>
> init.prototype.prop = true;
> </script>
>
  

问题是myClass('foo')没有按预期返回'foo'。代替,   它返回init。然后我尝试了这段代码:

如果编写为函数声明(更常见),您的代码可能会更清晰:

function myClass(arg) {
  return new init(arg);
}

function init(arg) {
  return arg;
}

当你调用myClass('foo')时,你将一个字符串传递给init,它被称为构造函数。然后该函数尝试返回字符串,但是作为构造函数调用的函数将始终返回一个对象。如果您尝试返回原语,它将返回其对象。在ECMA-262中没有明确说明。但它就在那里。

  

然后我尝试了这段代码:

     

var init = function(arg){      return [arg]; //现在init返回一个数组

因为数组是一个对象,所以这就是返回的内容。

> }
> 
  

myClass('foo')返回['foo'],然后是myClass('foo')。prop   变成未定义的。有谁知道如何解决它?

因为构造函数返回一个数组,而不是这个对象。返回的数组继承自Array.prototype,而不是init.prototype

答案 2 :(得分:2)

如果从函数返回值并尝试对其使用new关键字,则返回值将不是新实例化的对象,而是return之后的值。因此,在您的情况下,返回'foo'字符串,而不是您期望的新对象。

答案 3 :(得分:2)

如果要创建新类,可能需要考虑这种模式:

var MyClass =function(arg) {
    this.init(arg);
};
MyClass.prototype = {
    init: function(arg) {
        // Do something with that arg
        this.someArg = arg;
    },
    myProperty: 'Hell world',
    someArg: null   
};

var myVar = new MyClass('Some arg');

测试结束:

console.log(myVar.myProperty);
console.log(myVar.someArg);

检查出来:http://jsfiddle.net/4zwpm/