de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Lee Brindley
Lee Brindley
Question

Javascript: operator overloading

I've telah bekerja dengan JavaScript untuk beberapa hari sekarang dan telah sampai ke titik di mana saya ingin membebani operator untuk mendefinisikan objek.

Setelah bertugas di google mencari ini tampaknya anda dapat't secara resmi melakukan hal ini, namun ada beberapa orang di luar sana yang mengklaim beberapa bertele-tele cara melakukan tindakan ini.

Pada dasarnya saya've membuat Vector2 kelas dan ingin dapat melakukan hal-hal berikut:

var x = new Vector2(10,10);
var y = new Vector2(10,10);

x += y; //This does not result in x being a vector with 20,20 as its x & y values.

Bukannya aku'm harus melakukan ini:

var x = new Vector2(10,10);
var y = new Vector2(10,10);

x = x.add(y); //This results in x being a vector with 20,20 as its x & y values. 

Ada sebuah pendekatan yang dapat saya ambil untuk overload operator di Vector2 kelas? Saat ini hanya terlihat biasa jelek.

72 2013-10-27T16:51:12+00:00 5
Dan Mandel
Dan Mandel
Pertanyaan edit 31 Agustus 2017 в 3:26
Pemrograman
operators
javascript
operator-overloading
Solution / Answer
T.J. Crowder
T.J. Crowder
27 Oktober 2013 в 4:54
2013-10-27T16:54:01+00:00
Lebih
Sumber
Sunting
#22634972

Seperti yang anda've ditemukan, JavaScript doesn't dukungan operator overloading. Yang paling dekat anda bisa datang untuk melaksanakan toString (yang akan dipanggil ketika misalnya harus dipaksa untuk menjadi string) dan valueOf (yang akan dipanggil untuk memaksa itu ke nomor, misalnya ketika menggunakan + untuk penambahan, atau dalam banyak kasus ketika menggunakannya untuk rangkaian karena + mencoba untuk melakukan itu sebelum rangkaian), yang ini cukup terbatas. Tidak memungkinkan anda membuat Vector2 objek sebagai hasil.


Untuk orang-orang yang datang untuk pertanyaan ini yang ingin string atau angka sebagai hasil (bukan Vector2), meskipun, berikut ini adalah contoh dari valueOf dan toString. Contoh-contoh ini tidak menunjukkan operator overloading, hanya mengambil keuntungan dari JavaScript's built-in penanganan mengkonversi ke primitif:

valueOf

Ini contoh menggandakan nilai dari sebuah objek's val properti dalam menanggapi dipaksa untuk primitif, misalnya melalui +:

function Thing(val) {
    this.val = val;
}
Thing.prototype.valueOf = function() {
    // Here I'm just doubling it; you'd actually do your longAdd thing
    return this.val * 2;
};

var a = new Thing(1);
var b = new Thing(2);
console.log(a + b); // 6 (1 * 2 + 2 * 2)

Atau dengan ES2015's kelas:

class Thing {
    constructor(val) {
      this.val = val;
    }
    valueOf() {
      return this.val * 2;
    }
}

const a = new Thing(1);
const b = new Thing(2);
console.log(a + b); // 6 (1 * 2 + 2 * 2)

Atau hanya dengan benda-benda, tidak konstruktor:

var thingPrototype = {
    valueOf: function() {
      return this.val * 2;
    }
};

var a = Object.create(thingPrototype);
a.val = 1;
var b = Object.create(thingPrototype);
b.val = 2;
console.log(a + b); // 6 (1 * 2 + 2 * 2)

toString

Ini contoh mengkonversi nilai suatu obyek's val properti untuk atas kasus dalam menanggapi dipaksa untuk primitif, misalnya melalui +:

function Thing(val) {
    this.val = val;
}
Thing.prototype.toString = function() {
    return this.val.toUpperCase();
};

var a = new Thing("a");
var b = new Thing("b");
console.log(a + b); // AB

Atau dengan ES2015's kelas:

class Thing {
    constructor(val) {
      this.val = val;
    }
    toString() {
      return this.val.toUpperCase();
    }
}

const a = new Thing("a");
const b = new Thing("b");
console.log(a + b); // AB

Atau hanya dengan benda-benda, tidak konstruktor:

var thingPrototype = {
    toString: function() {
      return this.val.toUpperCase();
    }
};

var a = Object.create(thingPrototype);
a.val = "a";
var b = Object.create(thingPrototype);
b.val = "b";
console.log(a + b); // AB
Donald Duck
Donald Duck
Jawaban edit 5 Januari 2018 в 10:02
84
0
 user2259659
user2259659
7 Oktober 2014 в 5:04
2014-10-07T05:04:57+00:00
Lebih
Sumber
Sunting
#22634973

Sebagai T. J. berkata, anda tidak overload operator pada JavaScript. Namun, anda dapat mengambil keuntungan dari valueOf fungsi untuk menulis sebuah hack yang terlihat lebih baik daripada menggunakan fungsi-fungsi seperti add setiap waktu, tapi memaksakan kendala pada vektor x dan y adalah antara 0 dan MAX_VALUE. Berikut ini adalah kode:

var MAX_VALUE = 1000000;

var Vector = function(a, b) {
    var self = this;
    //initialize the vector based on parameters
    if (typeof(b) == "undefined") {
        //if the b value is not passed in, assume a is the hash of a vector
        self.y = a % MAX_VALUE;
        self.x = (a - self.y) / MAX_VALUE;
    } else {
        //if b value is passed in, assume the x and the y coordinates are the constructors
        self.x = a;
        self.y = b;
    }

    //return a hash of the vector
    this.valueOf = function() {
        return self.x * MAX_VALUE + self.y;
    };
};

var V = function(a, b) {
    return new Vector(a, b);
};

Kemudian anda dapat menulis persamaan seperti ini:

var a = V(1, 2);            //a -> [1, 2]
var b = V(2, 4);            //b -> [2, 4]
var c = V((2 * a + b) / 2); //c -> [2, 4]
19
0
Joshua Penman
Joshua Penman
22 Januari 2015 в 9:34
2015-01-22T21:34:46+00:00
Lebih
Sumber
Sunting
#22634974

FYI paper.js memecahkan masalah ini dengan menciptakan PaperScript, mandiri, cakupan javascript dengan operator overloading vektor, yang kemudian diproses kembali ke dalam javascript.

Tapi paperscript file harus secara khusus ditentukan dan diproses seperti itu.

6
0
 Stuffe
Stuffe
23 Agustus 2019 в 6:39
2019-08-23T18:39:58+00:00
Lebih
Sumber
Sunting
#22634976

It's mungkin untuk dilakukan vektor matematika dengan dua angka yang dikemas menjadi satu. Pertama saya akan menunjukkan contoh sebelum saya menjelaskan bagaimana cara kerjanya:

let a = vec_pack([2,4]);
let b = vec_pack([1,2]);

let c = a+b; // Vector addition
let d = c-b; // Vector subtraction
let e = d*2; // Scalar multiplication
let f = e/2; // Scalar division

console.log(vec_unpack(c)); // [3, 6]
console.log(vec_unpack(d)); // [2, 4]
console.log(vec_unpack(e)); // [4, 8]
console.log(vec_unpack(f)); // [2, 4]

if(a === f) console.log("Equality works");
if(a > b) console.log("Y value takes priority");

Saya menggunakan fakta bahwa jika anda sedikit pergeseran dua angka X kali dan kemudian menambahkan atau mengurangi mereka sebelum menggeser mereka kembali, anda akan mendapatkan hasil yang sama seperti jika anda tidak't bergeser mereka untuk memulai dengan. Demikian pula skalar perkalian dan pembagian karya simetris untuk bergeser nilai-nilai.

JavaScript nomor 52 bit integer presisi (64 bit mengapung), jadi aku akan berkemas satu nomor ke dia lebih tinggi tersedia 26 bit, dan satu ke yang lebih rendah. Kode ini dibuat sedikit lebih berantakan karena saya ingin dukungan yang ditandatangani angka.

vec_unpack = function(number){
    switch(((number & 33554432) !== 0) * 1 + (number < 0) * 2){
        case(0):
            return [(number % 33554432),Math.trunc(number / 67108864)];
        break;
        case(1):
            return [(number % 33554432)-33554432,Math.trunc(number / 67108864)+1];
        break;
        case(2):
            return [(((number+33554432) % 33554432) + 33554432) % 33554432,Math.round(number / 67108864)];
        break;
        case(3):
            return [(number % 33554432),Math.trunc(number / 67108864)];
        break;
    }
}

Satu-satunya downside dapat saya lihat dengan ini adalah bahwa x dan y harus berada dalam kisaran +-33 juta, karena mereka harus masuk dalam 26 bit masing-masing.

 Stuffe
Stuffe
Jawaban edit 25 Agustus 2019 в 5:32
0
0
J. Peterson
J. Peterson
21 Februari 2019 в 9:27
2019-02-21T21:27:42+00:00
Lebih
Sumber
Sunting
#22634975

Sebenarnya, ada satu varian dari JavaScript yang does dukungan operator overloading. ExtendScript, bahasa scripting yang digunakan oleh aplikasi Adobe seperti Photoshop dan Illustrator, tidak memiliki operator overloading. Di dalamnya, anda dapat menulis: `` Vector2.prototipe["+"] = function( b ) { kembali new Vector2( ini.x + b.x ini.y + b.y ); }

var a = new Vector2(1,1); var b = new Vector2(2,2); var c = a + b; `` Hal ini dijelaskan secara lebih rinci dalam "Adobe Extendscript JavaScript alat panduan" (saat ini link di sini). Sintaks tampaknya didasarkan pada (sekarang lama ditinggalkan) rancangan ECMAScript standar.

-3
0
Related communities 1
JavaScript Indonesia
JavaScript Indonesia
14 549 pengguna
Grup JavaScript yang membahas JavaScript, framework JS, dan Node JS secara universal. Cek Pinned Message untuk keterangan lebih lanjut. Komunitas ReactJS: https://t.me/react_idn
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
UbiBot UK
Terdaftar 14 jam yang lalu
2
Галина Утяшова
Terdaftar 1 hari yang lalu
3
Asilbek Qadamboyev
Terdaftar 4 hari yang lalu
4
Akshit Mehta
Terdaftar 1 minggu yang lalu
5
me you
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi