对象的价值和原型问题

Object's value and prototype issue

本文关键字:原型 问题 对象      更新时间:2023-09-26

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

<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 标记),但不返回具有存储此值的属性的对象

当你调用new init()并在init()内返回一个非对象时,它会生成一个init的实例,而不是返回的值。

如果从init()函数返回 Array,则会返回该数组;但 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原型添加更多属性和方法。

在你的代码中:

> <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) { 返回 [参数];现在 init 返回一个数组

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

> }
> 
myClass('foo') 返回 ['foo'

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

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

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

如果要

创建新类,则可能需要考虑以下模式:

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/