我正在尝试创建一个新类,但它似乎不起作用。这是代码:
<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标签),但不是具有存储此值的属性的对象
答案 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);