Использование функции прототипа JavaScript для инициализации переменной в «этом» контексте
-
16-10-2019 - |
Вопрос
Мне трудно объяснить словами, так что вот фрагмент кода, который я пробую, но Firefox/Firebug входит в Hailpin!
Я пытаюсь следовать это а также это в качестве гида. То, что я пытаюсь сделать здесь, это
- новый myobject.method ('String', OptionsArray);
Элементы 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.
Я также исправил то, как вы копировали значения в свойства, поскольку они удвоили имена собственности и сделали их немного грязным.