Помогите с прототипом объекта - PullRequest
4 голосов
/ 03 апреля 2010

Я изучаю javascript и у меня возникли проблемы с созданием объекта через прототип.
У меня есть это:

 <script type="text/javascript">

        function myclass(a, b, c) {
            if (arguments.length) { this.Init(a, b, c); }
        }
        myclass.prototype.Init = function(a, b, c) {
            this.param1 = a;
            this.param2 = b;
            this.param3 = c;
        };
        myclass.prototype.Print = function() {

            alert(this.param1 + '-' + this.param2 + '-' + this.param3);
        };

        var myObject = myclass(3, 5, 6);
        myObject.Print();


    </script>

но я получаю сообщение об ошибке с этим .Init (a, b, c);
Ошибка: объект не поддерживает это свойство или метод

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

Вы забыли ключевое слово new, когда объявляете myObject:

var myObject = new myclass(3, 5, 6);
0 голосов
/ 03 апреля 2010

Просто из любопытства, есть ли какая-то особая причина, по которой у вас есть отдельный метод init?

Функция, которая определяет ваш «класс», называется «конструктором», и вы можете просто выполнить настройку там. Если вы хотите «переинициализировать» объект, то это может быть полезно, но, похоже, здесь не годится.

Например:

// You might as well start wrapping your code now:

var myExample = (function myExample () {

    // A common convention is to start the name of constructors with a
    //      capital letter, one reason is it help makes it more obvious
    //      when you forget the new keyword...Whether you use it or not
    //      is up to you. Also note, calling it "MyClass" is a little
    //      misleading because it's not a "class" really. You might
    //      confuse yourself if you think of it as a class too much.
    //      If you're wondering why I put the name twice, it's because
    //      otherwise it would be an anonymous function which can be
    //      annoying when debugging. You can just use var MyClass = function () {}
    //      if you want

    var MyClass = function MyClass(a, b, c) {

        // This will set each parameter to whatever was provided
        //      or if nothing is provided: null. If you leave out
        //      the || "" part then any
        //      time a value is not provided the parameter will
        //      return "undefined". This may be what you want in some cases.

        this.param1 = a || "";
        this.param2 = b || "";
        this.param3 = c || "";   
    };

    // likewise it's convention to start most variables/functions lowercase
    //      I think it's easier to type/looks better, but do as you please.

    MyClass.prototype.print = function print() {
        alert(this.param1 + '-' + this.param2 + '-' + this.param3);
    };

    var myObject = new MyClass();
    myObject.print();
}());

"Упаковка" -

(function () {
 //your code here 
}());

Здесь в основном бессмысленно, но это то, с чем вам придется начать в конечном итоге, так что лучше начать прямо сейчас. Это только один способ «обернуть» и другие.

По сути, способ написания вашего сценария: если пользователь запускает другой сценарий с функцией MyClass, он может перезаписать ваш или наоборот, вызывая проблемы.

«Обертка» удерживает все это в пределах этой функции. Если вам нужно сделать что-то доступное для посторонних вещей, вы можете открыть это.

за комментарий:

Вы можете получить доступ к функциям и переменным изнутри оболочки, выставив их снаружи следующим образом:

var myApp = (function myApp(){

    // The constructor for our "class", this will be available from outside because
    //    we will expose it later

    var myClass = function(){
        //code to set up "class" etc


        // See how we can use private function within myApp
        privateFunction();
     };


    // Here we set up the private function, it will not be available outside myApp
    //    because will will not expose it
    var privateFunction = function(){ };


    // Another public function that we will expose later
    var otherPublic = function(){};

    //now we expose the stuff we want public by returning an object containing
    //    whatever it is we want public, in this case it's just myClass and otherPublic

    return { myClass: myClass, otherPublic: otherPublic  };
}()); 

Обратите внимание, что в этом примере мы просто выставляем конструктор, если вам нужен экземпляр объекта вам нужно собрать их в переменную и выставить эту переменную, например:

var theInstance = new myClass();
return { theInstance : theInstance };

Теперь он будет доступен вне myApp как myApp.theInstance

Вы также можете использовать более простую схему упаковки:

var myApp =  {

    myClass: function(){

        //if we want to call another function in myApp we have to do it like so:
        myApp.publicFunction();
    },

    publicFunction: function(){},

    someString: "this is a string"

};

Там myApp - это просто объектный литерал, содержащий ваши функции и т. Д. Основное отличие состоит в том, что ВСЕ в myApp может быть доступно извне через myApp.name или myApp [name];

...