2

現時点で作業しているコードは次のとおりです。

Object.defineProperty(String.prototype, "testy", {
    get: function() {
        return this.string;
    },
    set: function(string) {
        this.string = string;
    }
});

console.log("tessfef3t".testy());

を使用する前にString.prototype.testy = function {}、上記のコードに似たものを使用する方が良い方法であると言われました。それがどのように機能するのかはわかりませんが、そのコードはまだ機能していません。

誰かが私がしていることを正しく行う方法を教えてもらえますか?

ありがとう

4

3 に答える 3

2

testyは一種の「偽の」プロパティです。独自の値はありませんが、その値を設定または取得すると、関数setget関数が呼び出されます。次のように使用できます。

var foo = new String();

// this invokes the setter and sets foo.string to 5:
foo.testy = 5; 

// this invokes the getter and prints the value of foo.string
console.log(foo.testy); 

// this prints 5, because foo.string has been set by the setter
console.log(foo.string);

編集:

今、私はあなたが実際に何をしたいのかについてのあなたのコメントを見ています。文字列は不変であるため、文字列オブジェクトの値を変更することはできません。文字列オブジェクトを破棄して新しいオブジェクトに置き換える必要がありますが、これはオブジェクト自体のメンバー関数内では不可能です。

于 2012-08-13T13:10:27.760 に答える
1

これは私にとってはうまくいきました:

Object.defineProperty(String.prototype, "byteLength", {
    get: function() {
        var str = "" + this; // Get internal value
        // Compute size in actual bytes vs Unicode characters
        // per http://stackoverflow.com/a/23329386/912236
        for (var b = str.length, c = str.length - 1; 0 <= c; c--) {
            var a = str.charCodeAt(c);
            127 < a && 2047 >= a ? b++ : 2047 < a && 65535 >= a && (b += 2);
            56320 <= a && 57343 >= a && c--;
        }
        return b;
    }
});

> "Hello".byteLength
< 5

于 2015-04-19T14:04:44.613 に答える
1

ゲッターとセッターで行っているのは、他の場所では使用されていないプロパティを設定することだけであり、他に処理がない場合は、ゲッターとセッターを使用しても何も得られないため、元のアプローチの方が適しています。さらに、とにかく文字列に設定したプロパティを取得することはできません。JavaScript の文字列値 ( などの文字列リテラルが"foo"作成するものであり、一般的に有用な唯一の種類の文字列です) はオブジェクトではないため、プロパティにアクセスするには特別な処理が必要です: 事実上、一時Stringオブジェクトが作成されてスローされます。その後すぐに離れます。

最後に、ゲッターとセッターのもう 1 つの大きな欠点は、それらが ECMAScript 5 で指定されているため、比較的最近のブラウザーでしか利用できないことです。たとえば、IE < 9 では実装されていません。

于 2012-08-13T13:13:29.507 に答える