1

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

<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

4 回答 4

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

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

于 2012-06-01T02:03:27.910 回答
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,该字符串被称为构造函数。然后该函数尝试返回字符串,但是作为构造函数调用的函数将始终返回一个对象。如果您尝试返回原语,它将改为返回其this对象。在ECMA-262中没有很清楚地说明。但它就在那里。

然后我尝试了这段代码:

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

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

> }
> 

myClass('foo') 返回 ['foo'],但随后 myClass('foo').prop 变为未定义。有谁知道如何解决它?

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

于 2012-06-01T02:32:12.063 回答
2

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

于 2012-06-01T01:44:02.720 回答
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/

于 2012-06-01T01:46:58.040 回答