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()関数から配列を返す場合は、代わりに配列が返されます。initしかし、Array はプロトタイプを考慮しません:)

参照: 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

于 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 は undefined になります。誰もそれを解決する方法を知っていますか?

コンストラクターは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 に答える