Использование функции-прототипа javascript для инициализации переменной в контексте this - PullRequest
0 голосов
/ 21 января 2011

Мне сложно объяснить словами, вот фрагмент кода, который я пробую, но Firefox / firebug переходит в штопор!

Я пытаюсь руководствоваться этим и этим . То, что я пытаюсь сделать здесь, это

  1. new MyObject.Method ('string', optionsArray);
  2. элементы optionsArray повторяются и сохраняются с использованием функции-прототипа Set ()

    if(typeof(MyObj) == 'undefined') MyObj= {};
        MyObj.Method = function initialise(id,options) 
    {
        this.id = id;
        this.options = options;
        this.properties ={};
    
        for (var i = 0; i < this.options.length; i++)  // =>options.length=2 (correct)
        {
            var obj = this.options[i];  
            //get the keynames, pass with values to Set() to update properties
            for (var keys in obj) 
            {
                console.log(keys);  //=> correctly prints 'property1' and 'currentValue'
                this.Set(keys,obj); //=> this is i guess where it enters a loop?
            }
        }
    }
    
    //sets properties
    MyObj.Method.prototype.Set = function (name, value) 
    {
        this.properties[name.toLowerCase()] = value;
    }
    

    и в моем блоке скрипта HTML-страницы у меня есть

    window.onload = function () {
    
            var options = [
            {    property1: {
                    show: true,
                    min: 0,
                    max: 100
                }
            },
            {
                currentValue: {
                    show: true,
                    colour: 'black'
                }
            }
        ];
    
    var myObj = new MyObj.Method('someDivId',options);
    }
    

пожалуйста, сообщите, если я слишком усложняю код. Я думаю, что проверка hasOwnProperty поможет.

Ответы [ 3 ]

3 голосов
/ 21 января 2011

Это должен быть более чистый способ достижения того, что вы хотите:

function MyObj(id, options) { // a function that will get used as the constructor
    this.id = id;
    this.options = options;
    this.properties = {};
    this.set(options); // call the set method from the prototype
}

MyObj.prototype.set = function(options) { // set the options here
    for(var i = 0, l = options.length; i < l; i++) {
        var obj = this.options[i];
        for(var key in obj) {
            if (obj.hasOwnProperty(key)) { // this will exclude stuff that's on the prototype chain!
                this.properties[key] = obj[key];
            }
        }
    }
    return this; // return the object for chaining purposes
                 // so one can do FooObj.set([...]).set([...]);
};

var test = new MyObj('simeDivId', [...]); // create a new instance of MyObj
test.set('bla', [...]); // set some additional options

Примечание: Информация о hasOwnProperty приведена здесь .

1 голос
/ 21 января 2011
var MyObj = {};

MyObj.Method = function initialise(id,options) {

    this.id = id;
    this.options = options;
    this.properties = {};

    for (var i = 0; i < this.options.length; i++)
    {
        var obj = this.options[i];  
        for (var keys in obj) {

            this.Set(keys,obj[keys]); 

            //*fix obj => obj[keys] 
            // (and it should be singular key rather then keys

        }
    }

    console.log(this.properties) // will output what you want
}

//sets properties
MyObj.Method.prototype.Set = function (name, value) {
    this.properties[name.toLowerCase()] = value;
}


var options = [{
    property1: {
        show: true,
        min: 0,
        max: 100
    }
},{
    currentValue: {
        show: true,
        colour: 'black'
    }
}];

var myObj = new MyObj.Method('someDivId',options);

это должно сработать, если ваш myObj = new MyObj ... находится вне вашего события onload, и параметры выходят за его рамки, поскольку они объявлены как закрытая переменная для анонимной функциик событию onload.

Я также исправил способ, которым вы копировали значения в свойства, так как они удваивали имена свойств и делали их немного грязными.

1 голос
/ 21 января 2011

Я сделал объявление для MyObj и удалил имя функции initialise, поскольку вы явно объявляете эту функцию свойством MyObj.Ваш окончательный код будет таким, как показано ниже, и это прекрасно работает для меня.Обратите внимание, что вы не можете фактически вызывать функцию до тех пор, пока вы не объявите функцию-прототип, потому что иначе объект не будет иметь понятия о функции Set.

var MyObj = {};

MyObj.Method = function (id,options)
{
    this.id = id;
    this.properties ={};

    for (var i = 0; i < options.length; i++)  // =>options.length=2 (correct)
    {
        var obj = options[i];  
        //get the keynames, pass with values to Set() to update properties
        for (var keys in obj) 
        {
            console.log(keys);  //=> correctly prints 'property1' and 'currentValue'
            this.Set(keys,obj); //=> this is i guess where it enters a loop?
        }
    }
}

MyObj.Method.prototype.Set = function (name, value) 
{
    this.properties[name.toLowerCase()] = value;
}

var options = [
    {    property1: {
            show: true,
            min: 0,
            max: 100
        }
    },
    {
        currentValue: {
            show: true,
            colour: 'black'
        }
    }
];

var myObj = new MyObj.Method('someDivId',options);
...