Γραφομηχανή ιδιωτικού μέλη

ψήφοι
76

Ψάχνω στην υλοποίηση των ιδιωτικών μέλη στη γραφομηχανή, και θεωρώ ότι είναι μια μικρή σύγχυση. Intellisense δεν επιτρέπει να έχουν πρόσβαση σε ιδιωτική μέλος, αλλά σε καθαρή JavaScript, είναι όλα εκεί. Αυτό με κάνει να πιστεύω ότι TS δεν εφαρμόζει σωστά ιδιωτικά μέλη. Καμία ιδέα;

class Test{
  private member: any = private member;
}
alert(new Test().member);
Δημοσιεύθηκε 03/10/2012 στις 18:24
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
68

Ακριβώς όπως με τον έλεγχο τύπου, η προστασία της ιδιωτικής ζωής των μελών επιβάλλονται μόνο εντός του compiler.

Μια ιδιωτική περιουσία υλοποιείται ως ένα κανονικό ιδιότητα και τον κωδικό έξω από την τάξη δεν επιτρέπεται να έχουν πρόσβαση.

Για να κάνετε κάτι πραγματικά ιδιωτικά μέσα στην τάξη, δεν μπορεί να είναι μέλος της κατηγορίας, θα ήταν μια τοπική μεταβλητή που δημιουργήθηκε μέσα σε ένα πεδίο λειτουργίας μέσα στον κώδικα που δημιουργεί το αντικείμενο. Αυτό θα σημαίνει ότι δεν μπορείτε να έχετε πρόσβαση σαν μέλος της κατηγορίας, δηλαδή με τη χρήση της thisλέξης-κλειδιού.

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

ψήφοι
33

Την Javascript δεν υποστηρίζει ιδιωτικές μεταβλητές.

function MyClass() {
    var myPrivateVar = 3;

    this.doSomething = function() {
        return myPrivateVar++;        
    }
}

Σε γραφομηχανή αυτό θα εκφράζεται όπως έτσι:

class MyClass {

    doSomething: () => number;

    constructor() {
        var myPrivateVar = 3;

        this.doSomething = function () {
            return myPrivateVar++;
        }
    }
}

ΕΠΕΞΕΡΓΑΣΙΑ

Η προσέγγιση αυτή θα πρέπει να χρησιμοποιείται μόνο με φειδώ όπου είναι απολύτως αναγκαία. Για παράδειγμα, αν θέλετε να cache έναν κωδικό πρόσβασης προσωρινά.

Υπάρχουν έξοδα απόδοση σε χρήση αυτό το μοτίβο (ανεξάρτητα από Javascript ή γραφομηχανή) και θα πρέπει να χρησιμοποιείται μόνο όταν είναι απολύτως απαραίτητο.

Απαντήθηκε 06/06/2014 στις 17:01
πηγή χρήστη

ψήφοι
11

Μόλις υποστήριξη για WeakMap είναι ευρύτερα διαθέσιμη, υπάρχει μια ενδιαφέρουσα τεχνική περιγράφεται λεπτομερώς στο παράδειγμα # 3 εδώ .

Παρέχει τη δυνατότητα για τα προσωπικά δεδομένα και αποφεύγει τα έξοδα απόδοση του Ιάσονα Evans παράδειγμα επιτρέποντας τα δεδομένα να είναι προσβάσιμα από τις μεθόδους πρωτότυπο και όχι μόνο μεθόδους περίπτωση.

Η συνδεδεμένη MDN WeakMap λίστες σελίδα υποστήριξης του προγράμματος περιήγησης στο Chrome 36, Firefox 6.0, IE 11, Opera 23 και Safari 7.1.

let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
  constructor(counter, action) {
    _counter.set(this, counter);
    _action.set(this, action);
  }
  decrement() {
    let counter = _counter.get(this);
    if (counter < 1) return;
    counter--;
    _counter.set(this, counter);
    if (counter === 0) {
      _action.get(this)();
    }
  }
}
Απαντήθηκε 10/04/2016 στις 04:23
πηγή χρήστη

ψήφοι
3

Χάρη στην Sean Feldman για τη σύνδεση με την επίσημη συζήτηση για το θέμα αυτό - δείτε την απάντησή του για το σύνδεσμο.

Διάβασα τη συζήτηση που συνδέονται με, και εδώ είναι μια περίληψη των βασικών σημείων:

  • Εισήγηση: ιδιωτικές περιουσίες σε κατασκευαστή
    • προβλήματα: δεν μπορούν να έχουν πρόσβαση από το πρωτότυπο λειτουργίες
  • Εισήγηση: ιδιωτικές μεθόδους κατασκευαστή
    • προβλήματα: ίδιο όπως και με τις ιδιότητες, καθώς θα χάσουν το πλεονέκτημα απόδοσης της δημιουργίας μιας λειτουργίας μία φορά ανά τάξη στο πρωτότυπο? αντί να δημιουργήσετε ένα αντίγραφο της λειτουργίας για κάθε περίσταση
  • Εισήγηση: προσθέστε στερεότυπο στην αφηρημένη πρόσβαση ιδιοκτησία και την επιβολή της προβολής
    • προβλήματα: μείζονα γενικά την απόδοση? Γραφομηχανή είναι σχεδιασμένο για μεγάλες εφαρμογές
  • Εισήγηση: γραφομηχανή τυλίγει ήδη τους ορισμούς κατασκευαστή και πρωτότυπο τρόπο σε κλείσιμο? θέσει ιδιωτική μεθόδους και τις ιδιότητες υπάρχει
    • προβλήματα με τη θέση ιδιωτικές περιουσίες σε αυτό το κλείσιμο: γίνονται στατικές μεταβλητές? Δεν υπάρχει μία ανά περίπτωση
    • προβλήματα με την τοποθέτηση του ιδιωτικού μεθόδους σε αυτό το κλείσιμο: δεν έχουν πρόσβαση σε thisχωρίς κάποιου είδους λύση
  • Εισήγηση: διαμελίζουν αυτόματα τα ιδιωτικά ονόματα των μεταβλητών
    • αντεπιχειρήματα: αυτό είναι μια σύμβαση ονομασίας, όχι ένα κατασκεύασμα γλώσσα. Διαμελίζουν μόνοι σας
  • Εισήγηση: Σχολιάστε ιδιωτική μεθόδους με @privateτόσο minifiers που αναγνωρίζουν ότι τα σχόλια μπορούν να minify αποτελεσματικά τα ονόματα μέθοδο
    • Δεν υπάρχουν σημαντικά αντεπιχειρήματα σε αυτό

Συνολικά αντεπιχειρήματα για την προσθήκη υποστήριξης ορατότητα σε εκπέμπονται κωδικό:

  • Το πρόβλημα είναι ότι η ίδια η Javascript δεν έχει τροποποιητές προβολή - αυτό δεν είναι πρόβλημα γραφομηχανή του
  • υπάρχει ήδη ένα καθιερωμένο πρότυπο στην κοινότητα JavaScript: πρόθεμα ιδιωτικές ιδιότητες και τις μεθόδους με έναν χαρακτήρα υπογράμμισης, η οποία λέει «να προχωρήσει με δική σας ευθύνη»
  • όταν γραφομηχανή σχεδιαστές είπε ότι πραγματικά ιδιωτικές ιδιότητες και οι μέθοδοι δεν είναι «δυνατή», που σημαίνει «δεν είναι δυνατή υπό τους περιορισμούς του σχεδιασμού μας», συγκεκριμένα:
    • Η εκπεμπόμενη JS είναι ιδιωματικές
    • Στερεότυπο είναι ελάχιστη
    • Κανένα πρόσθετο γενικά σε σύγκριση με φυσιολογικά JS OOP
Απαντήθηκε 06/10/2016 στις 14:51
πηγή χρήστη

ψήφοι
2

Στη γραφομηχανή Ιδιωτική λειτουργίες είναι προσβάσιμες μόνο μέσα στην τάξη. Σαν

εισάγετε περιγραφή της εικόνας εδώ

Και θα δείτε ένα μήνυμα σφάλματος όταν προσπαθείτε να αποκτήσετε πρόσβαση σε μια ιδιωτική μέλος. Εδώ είναι το παράδειγμα:

εισάγετε περιγραφή της εικόνας εδώ

Σημείωση: Θα είναι καλά με javascript και τόσο η λειτουργία είναι διαθέσιμη και εκτός.

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

ψήφοι
1

Αντιλαμβάνομαι αυτό είναι μια παλαιότερη συζήτηση, αλλά θα μπορούσε ακόμα να είναι χρήσιμο να μοιραστώ λύση μου για το πρόβλημα των δήθεν ιδιωτικές μεταβλητές και τις μεθόδους σε μια γραφομηχανή «διαρροή» έξω στη δημόσια διασύνδεση του καταρτίζονται τάξη JavaScript.

Για μένα το θέμα είναι καθαρά αισθητικούς, δηλαδή είναι όλα σχετικά με την οπτική ακαταστασία όταν μια μεταβλητή παράδειγμα προβάλλεται σε DevTools. Λύση μου είναι στην ομάδα ιδιωτική δηλώσεις μαζί μέσα σε ένα άλλο τάξης που στη συνέχεια αρχικοποιείται στην κύρια κατηγορία και να ανατίθενται σε ένα private(αλλά ακόμα ορατά στο κοινό, JS) μεταβλητή με ένα όνομα όπως __(διπλή υπογράμμιση).

Παράδειγμα:

class Privates {
    readonly DEFAULT_MULTIPLIER = 2;
    foo: number;
    bar: number;

    someMethod = (multiplier: number = this.DEFAULT_MULTIPLIER) => {
        return multiplier * (this.foo + this.bar);
    }

    private _class: MyClass;

    constructor(_class: MyClass) {
        this._class = _class;
    }
}

export class MyClass {
    private __: Privates = new Privates(this);

    constructor(foo: number, bar: number, baz: number) {
        // assign private property values...
        this.__.foo = foo;
        this.__.bar = bar;

        // assign public property values...
        this.baz = baz;
    }

    baz: number;

    print = () => {
        console.log(`foo=${this.__.foo}, bar=${this.__.bar}`);
        console.log(`someMethod returns ${this.__.someMethod()}`);
    }
}

let myClass = new MyClass(1, 2, 3);

Όταν η myClassπερίπτωση προβάλλεται σε DevTools, αντί να δείτε όλα τα «ιδιωτικά» τα μέλη του αναμειγμένα με πραγματικά δημόσια αυτά (τα οποία μπορεί να είναι πολύ οπτικά βρώμικο στη σωστή refactored κωδικό πραγματική ζωή) μπορείτε να δείτε τα ομαδοποιούνται σωστά στο εσωτερικό του κατέρρευσε __ακινήτου:

εισάγετε περιγραφή της εικόνας εδώ

Απαντήθηκε 14/09/2018 στις 22:12
πηγή χρήστη

ψήφοι
0

Πολλοί άνθρωποι ισχυρίζονται κάτι τέτοιο δεν είναι δυνατό, λόγω των περιορισμών σε JavaScript. Θα έλεγα ότι είναι οι περιορισμοί στη δημιουργικότητα προγραμματιστές JavaScript.

Είμαι ανάπτυξη μιας βιβλιοθήκης τώρα που επιτρέπει σε ιδιώτες και προστατεύεται κληρονομική μέλη των κατηγοριών, καθώς και διασυνδέσεις, κλπ ονομάζεται ClassJS. Δείτε το εδώ στο GitHub .

Απαντήθηκε 12/04/2017 στις 01:06
πηγή χρήστη

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