να πάρει και να με γραφομηχανή

ψήφοι
320

Προσπαθώ να δημιουργήσει πάρει και να ορίσετε τη μέθοδο για ένα ακίνητο:

private _name: string;

Name() {
    get:
    {
        return this._name;
    }
    set:
    {
        this._name = ???;
    }
}

Ποια είναι η λέξη-κλειδί για να ορίσετε μια τιμή;

Δημοσιεύθηκε 10/10/2012 στις 20:52
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
571

Γραφομηχανή χρησιμοποιεί κτήτορας / setter σύνταξη που είναι σαν Actionscript3.

class foo {
    private _bar:boolean = false;
    get bar():boolean {
        return this._bar;
    }
    set bar(theBar:boolean) {
        this._bar = theBar;
    }
}

Αυτό θα παράγουν αυτό το Javascript, χρησιμοποιώντας τη λειτουργία EcmaScript 5 Object.defineProperty ().

var foo = (function () {
    function foo() {
        this._bar = false;
    }
    Object.defineProperty(foo.prototype, "bar", {
        get: function () {
            return this._bar;
        },
        set: function (theBar) {
            this._bar = theBar;
        },
        enumerable: true,
        configurable: true
    });
    return foo;
})();

Έτσι για να το χρησιμοποιήσετε,

var myFoo = new foo();
if(myFoo.bar) {         // calls the getter
    myFoo.bar = false;  // calls the setter and passes false
}

Ωστόσο, προκειμένου να το χρησιμοποιήσει σε όλα, θα πρέπει να βεβαιωθείτε ότι η στόχους γραφομηχανή compiler ECMAScript5. Εάν εκτελείτε τον compiler γραμμή εντολών, χρησιμοποιήστε --target σημαία σαν αυτό?

TSC --target ES5

Εάν χρησιμοποιείτε το Visual Studio, πρέπει να επεξεργαστείτε το αρχείο έργου σας για να προσθέσετε τη σημαία στη διαμόρφωση του εργαλείου TypeScriptCompile κατασκευής. Μπορείτε να δείτε ότι εδώ :

Όπως @DanFromGermany υποδηλώνει κάτω, αν σας είναι απλά διαβάζοντας και γράφοντας ένα τοπικό ακίνητο, όπως foo.bar = true, στη συνέχεια, έχοντας ένα setter και κτήτορας ζευγάρι είναι υπερβολή. Μπορείτε πάντα να τα προσθέσετε αργότερα αν χρειαστεί να κάνουμε κάτι, όπως υλοτομία, όταν το ακίνητο έχει διαβάσει ή να γράψει.

Απαντήθηκε 12/10/2012 στις 01:19
πηγή χρήστη

ψήφοι
47

Ezward έχει ήδη δώσει μια καλή απάντηση, αλλά έχω παρατηρήσει ότι ένα από τα σχόλια ρωτά πώς χρησιμοποιείται. Για τους ανθρώπους σαν εμένα που σκοντάφτουν πάνω σε αυτό το θέμα, σκέφτηκα ότι θα ήταν χρήσιμο να υπάρχει μια σύνδεση με την επίσημη τεκμηρίωση για getters και setters στην ιστοσελίδα γραφομηχανή όπως αυτή εξηγεί καλά, ελπίζουμε ότι μένουν πάντα up-to-ημερομηνία με αλλαγές έκανε, και δείχνει παράδειγμα χρήσης:

http://www.typescriptlang.org/docs/handbook/classes.html

Ειδικότερα, για όσους δεν είναι εξοικειωμένοι με αυτό, σημειώστε ότι δεν μπορείτε να ενσωματώσει τη λέξη «περάσει» σε μια κλήση σε έναν συλλέκτη (και ομοίως για setters):

var myBar = myFoo.getBar(); // wrong    
var myBar = myFoo.get('bar');  // wrong

Θα πρέπει απλά να το κάνετε αυτό:

var myBar = myFoo.bar;  // correct (get)
myFoo.bar = true;  // correct (set) (false is correct too obviously!)

δίνεται μια κατηγορία, όπως:

class foo {
  private _bar:boolean = false;

  get bar():boolean {
    return this._bar;
  }
  set bar(theBar:boolean) {
    this._bar = theBar;
  }
}

τότε ο κτήτορας «γραμμή» για την ιδιωτική ιδιοκτησία «_bar» θα ονομάζεται.

Απαντήθηκε 15/01/2016 στις 12:53
πηγή χρήστη

ψήφοι
41

Εδώ είναι ένα παράδειγμα εργασίας που θα πρέπει να σας προς τη σωστή κατεύθυνση:

class Foo {
    _name;

    get Name() {
        return this._name;
    }

    set Name(val) {
        this._name = val;
    }
}

Getters και setters σε JavaScript είναι μόνο κανονικές λειτουργίες. Ο ρυθμιστής είναι μια συνάρτηση που παίρνει μια παράμετρο του οποίου η αξία είναι η αξία που έχουν τεθεί.

Απαντήθηκε 10/10/2012 στις 21:07
πηγή χρήστη

ψήφοι
2

Είναι πολύ παρόμοια με τη δημιουργία κοινών μεθόδων, με απλά λόγια την λέξη-κλειδί διατηρούνται getή setστην αρχή.

class Name{
    private _name: string;

    getMethod(): string{
        return this._name;
    }

    setMethod(value: string){
        this._name = value
    }

    get getMethod1(): string{
        return this._name;
    }

    set setMethod1(value: string){
        this._name = value
    }
}

class HelloWorld {

    public static main(){

        let test = new Name();

        test.setMethod('test.getMethod() --- need ()');
            console.log(test.getMethod());

        test.setMethod1 = 'test.getMethod1 --- no need (), and used = for set ';
            console.log(test.getMethod1);
    }
}
HelloWorld.main();

Σε αυτή την περίπτωση μπορείτε να παραλείψετε το είδος επιστροφής στην get getMethod1() {

    get getMethod1() {
        return this._name;
    }
Απαντήθηκε 22/03/2016 στις 14:13
πηγή χρήστη

ψήφοι
2

Μπορείτε να γράψετε αυτό

class Human {
    private firstName : string;
    private lastName : string;

    constructor (
        public FirstName?:string, 
        public LastName?:string) {

    }

    get FirstName() : string {
        console.log("Get FirstName : ", this.firstName);
        return this.firstName;
    }
    set FirstName(value : string) {
        console.log("Set FirstName : ", value);
        this.firstName = value;
    } 

    get LastName() : string {
        console.log("Get LastName : ", this.lastName);
        return this.lastName;
    }
    set LastName(value : string) {
        console.log("Set LastName : ", value);
        this.lastName = value;
    } 

}
Απαντήθηκε 11/10/2012 στις 19:32
πηγή χρήστη

ψήφοι
0

TS προσφέρει getters και setters που επιτρέπουν ιδιότητες του αντικειμένου για να έχετε περισσότερο έλεγχο για το πώς θα είναι προσβάσιμες (συλλέκτη) ή ενημέρωση (setter) εκτός του αντικειμένου. Αντί για άμεση πρόσβαση ή την ενημέρωση του ακινήτου λειτουργία μεσολάβησης ονομάζεται.

Παράδειγμα:

class Person {
    constructor(name: string) {
        this._name = name;
    }

    private _name: string;

    get name() {
        return this._name;
    }

    // first checks the length of the name and then updates the name.
    set name(name: string) {
        if (name.length > 10) {
            throw new Error("Name has a max length of 10");
        }

        this._name = name;  
    }

    doStuff () {
        this._name = 'foofooooooofoooo';
    }


}

const person = new Person('Willem');

// doesn't throw error, setter function not called within the object method when this._name is changed
person.doStuff();  

// throws error because setter is called and name is longer than 10 characters
person.name = 'barbarbarbarbarbar';  
Απαντήθηκε 11/07/2019 στις 17:53
πηγή χρήστη

ψήφοι
0

Νομίζω ότι ίσως πάρει γιατί είναι τόσο συγκεχυμένη. Στο παράδειγμά σας, θα θέλαμε getters και setters για _name. Αλλά θα το πετύχουμε αυτό με τη δημιουργία getters και setters για άσχετο μεταβλητή κλάσης Name.

Σκεφτείτε το εξής:

class Car{
    private tiresCount = 4;
    get yourCarTiresCount(){
        return this.tiresCount ;
    }
    set yourCarTiresCount(count) {
        alert('You shouldn't change car tire count')
    }
}

Πάνω κώδικας κάνει ακόλουθα:

  1. getκαι setνα δημιουργήσει κτήτορας και setter για την yourCarTiresCount( όχι γιαtiresCount ).

Ο κτήτορας είναι:

function() {
    return this.tiresCount ;
}

και ο ρυθμιστής είναι:

function(count) {
    alert('You shouldn't change car tire count');
}

Δηλαδή, κάθε φορά που κάνουμε new Car().yourCarTiresCount, κτήτορας τρέχει. Και για κάθε new Car().yourCarTiresCount('7')τρέχει setter.

  1. Έμμεσα δημιουργήσει κτήτορας, αλλά δεν το ρυθμιστή, για ιδιωτική tireCount.
Απαντήθηκε 13/10/2017 στις 19:11
πηγή χρήστη

ψήφοι
-2

Εάν εργάζεστε με μονάδες γραφομηχανή και προσπαθούν να προσθέσετε ένα συλλέκτη που εξάγεται, μπορείτε να κάνετε κάτι σαν αυτό:

// dataStore.ts
export const myData: string = undefined;  // just for typing support
let _myData: string;  // for memoizing the getter results

Object.defineProperty(this, "myData", {
    get: (): string => {
        if (_myData === undefined) {
            _myData = "my data";  // pretend this took a long time
        }

        return _myData;
    },
});

Στη συνέχεια, σε ένα άλλο αρχείο που έχετε:

import * as dataStore from "./dataStore"
console.log(dataStore.myData); // "my data"
Απαντήθηκε 28/12/2017 στις 18:34
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more