Obiekty w Javascript - kilka pytań

0

Witam,
Mam dwa pytania :

  1. Dlaczego nie działa mi tworzenie obiektu NotAuto
  2. Jaka jest różnica pomiędzy metodą tworzenia obiektu Autoss a Autor

Dziękuję z góry.

Tworzenie obiektów:

var notauto = new NotAuto();// Nie dziala wywolanie kontruktora
var auto = new Autoss();
var autor = new Autor();

obiekt NotAuto :

var NotAuto = function() {
   function NotAuto() {
       alert("NotAuto");
   };
                
   roksa = function() { return 1; };

  return NotAuto;
};

Obiekt Autoss


            var Autoss = (function() {
                function Autoss() {
                    alert("Autoss");
                }
                
                this.id = 12;
                
                roksa2 = function () { return 2;};
                
                return Autoss;
            })();

Obiekt Autor:

 function Autor() {
                alert("213");
                this.id = 12,
                this.roksa3 = function() {
                  return this.speed;
                };

                // inny sposób zapisu
                this.accelerate = Accelerate;

                function Accelerate() {
                  this.speed++;
                }
            };
0
  1. Nie działa, bo nie tak się tworzy te obiekty.
   function Actor(name) {
       this.name = name;
       this.method = function (something) {
           console.log(name + "," + somethig);
       }
   }

   var object = new Actor("Michael");
   object.method("cos");

Jak chcesz żeby Twoje obiekty Autoss i NotAuto dało się tworzyc przez new i miały metody, to wywal z nich return, a zmienne w środku deklaruj nie tak:

roksa = function () {

tylko tak

this.roksa = function () {
0

Jeśli chodzi o punkt 1, to już wykorzystałem Twój sposób tworzenia obiektu. Obiekt-AUTOR.
Odnośnie tworzenie obiektu Autoss, to w taki sposób są np. kompilowane obiekty z ECMA6 na ECMA5 (https://www.typescriptlang.org/play/)

Moje pytania brzmiały całkowicie inaczej!!!.
Część wyjaśnienia znalazłem tutaj : http://stackoverflow.com/questions/8231730/closures-in-auto-executing-functions-vs-objects
NotAuto nie działa, z powodu błędnego zapisu. Tylko dalej nie wiem, po co tu jest potrzebne samowywołanie.

0

Jeśli chodzi o kod z linka, to ten kod:

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
}());

to to samo co to

function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return "Hello, " + this.greeting;
};

Opakowanie tego kodu niżej, w samowywołującą się funkcję (żeby uzyskać kod wyżej) jest prawdopodobnie po to by ograniczyć scope.

PS:W Twoim kodzie, Autoss (ten wewnętrzny) jest kontruktorem, i zwracasz go wywołując funkcję anonimową. Natomiast w NotAuto to ta zewnętrzna NotAuto jest konstruktorem, a to nie jest Twój zamierzony efekt.

0

Można prosić o wyjaśnie scopów, bo mi się cały czas wydaję że Twój pierwszy przykład to obiekt, natomiast drugi to referencja jak w Javie.

Ponieważ pierwszy przykład wykonuje się zawsze, natomiast drugi w czasie użycia operatora new

1

Pierwszy też się wykona kiedy użyjesz new. Te kody, pod względem działania, są takie same. Może ten kod Ci to lepiej wyjaśni:

var zmienna = 2; // ta linijka

var zmienna = (function() { // oraz ten kod
    return 2;
})();

... mają dokładnie to samo znaczenie. Nie różnią się niczym. Oba sprawią że w zmiennej zmienna będzie 2. Moje dwa kody działają tak samo, w obu przypadkach w tej zmiennej będzie funkcja-konstruktor tylko w jednym jest po prostu zadeklarowana, a w drugim ten konstruktor jest zwracany przez funkcję samowywołującą się.


PS: Co do scope'ów, to znajdziesz 1000 przykładów w google ale w skrócie:

Scope to zakres. Dokładniej zakres widzialności zmiennych. Jeśli zrobisz po prostu

var zmienna = 2;

to wszędzie w skrypcie, nawet kod z innych plików, będzie mógł ją edytować, bo jest globalna.
Jeśli natomiast zrobisz coś takiego:

function () {
    var zmienna = 2;
}

i jakiś kod będzie chciał się do niej odwołać, to już nie da rady.

1 użytkowników online, w tym zalogowanych: 0, gości: 1