Использование функции прототипа JavaScript для инициализации переменной в «этом» контексте

StackOverflow https://stackoverflow.com/questions/4759084

Вопрос

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

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

  1. новый myobject.method ('String', OptionsArray);
  2. Элементы OptionsArray иеры и сохраняются с использованием набора функций прототипа ()

    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 поможет.

Это было полезно?

Решение

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

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 о том, пожалуйста, посмотрите здесь.

Другие советы

Я сделал декларацию за 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);
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 = новый myobj ... За пределами вашего события Onload и параметров были вне его масштаба, так как оно было объявлено как приватное переменную для анонимной функции, связанной с событием Onload.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top