Цитата:
function FormField(data) { this._d = data; } function FormFile(data, opts) { FormField.call(this, data); this.opts = opts; } FormFile.prototype = Object.create(FormField.prototype); FormFile.prototype.constructor = FormFile; o=new FormField() console.log(o.constructor); // [Function: FormField] o=new FormFile() console.log(o.constructor); // [Function: FormFile] |
devote,
Печально все таки, что эти гребаные комитетчики ломают язык. Если бы __proto__ не было deprecated, можно было бы обойтись без бубнов function FormField(data) { this._d = data; } function FormFile(data, opts) { FormField.call(this, data); this.opts = opts; } FormFile.prototype.__proto__=FormField.prototype o=new FormField() console.log(o.constructor); // [Function: FormField] o=new FormFile() console.log(o.constructor); // [Function: FormFile] // [Function: FormField] // [Function: FormFile] Одна надежда -- на setPrototypeOf. Я надеюсь, она будет обладать функциональными возможностями __proto__? |
krutoy, на здоровье :)
/** * Inherits a target (Class_1) from a source (Class_2) * @param {Function} target * @param {Function} source */ function inherit(target, source) { target.prototype = Object.create(source.prototype); target.prototype.constructor = target; target.super_ = source; } // --------------------- function FormField(data) { this._d = data; } // ------------------------- inherit(FormFile, FormField); function FormFile(data, opts) { FormFile.super_.apply(this, arguments); this.opts = opts; } // ------------------------- var a = new FormFile(1, 2); var b = new FormFile(10, 22); console.log(a, a instanceof FormField, b instanceof FormField); console.log(b, a instanceof FormFile, b instanceof FormFile); |
nerv_,
Это можно и проще сделать Object.prototype.extend=function(src){ for(var i in src){if(i in this) continue; this[i]=src[i]} } function FormField(data) { this._d = data; } function FormFile(data, opts) { FormField.call(this, data); this.opts = opts; } FormFile.prototype.extend(FormField.prototype) o=new FormField() console.log(o.constructor); // [Function: FormField] o=new FormFile() console.log(o.constructor); // [Function: FormFile] Но, тем не менее... |
Цитата:
|
devote,
Да, ступил, извиняюсь. |
devote,
Вот так, кажись, можно Object.prototype.inherit=function(parent){ var o = Object.create(parent.prototype) o.constructor=this.prototype.constructor this.prototype=o } function FormField(data) { this._d = data; } function FormFile(data, opts) { FormField.call(this, data); this.opts = opts; } FormFile.inherit(FormField) o=new FormField() console.log(o.constructor); // [Function: FormField] o=new FormFile() console.log(o.constructor); // [Function: FormFile] |
krutoy,
да, все это сахар конечно |
devote, получается вроде наоборот. После
FormField.call(this, data); вся тряхомудия FormFile будет перезаписана, или я все еще туплю. Общий чертеж как сейчас работает. function FormField(elem){ var // из елемента достаются всякие атрибуты единовременно ; return { elem:elem, validate:function(event){if(type in rules)//...}, update:function(value){elem.value=value}, } } function FormFile(elem){ var // из елемента достаются всякие атрибуты единовременно ; return { elem:image_list, validate:function(){// тут все голимо, ибо такое поле обычно одно, ну или 2, х с ним}, update:function(html){image_list.innerHTML=html;}, } } // по change и input формы вызывается внешнее управление var validate = function(event){ var elem=event.target; try{ if(elem.name && elem.name in inputs) // inputs - это коллекция тех самых inputs[elem.name].validate(event); } catch(err){ // еррор хендлер, в частности inputs[name].elem.classList.add('invalid'); } }; // по onload xmlhttprequest еще раз внешнее управление for(var name in data) inputs[name].update(data[name]); Ну вот, так сейчас я сделал, все блин работает, почему - не понятно. То есть понятно - за счет особенности js грести под методы и кложи контекст. В терминах php хрень непостижимая. Вероятно и не надо тут пытаться воспроизвести классическое наследование. Те же задачи решаются просто в другой плоскости. То есть у меня 2 как бы объекта с одинаковым интерфейсом. При чем про свой этот интерфейс объекты не знают, ибо он снаружи, а внутри чисто приватные переменные, которые загружаются из контекста. Чтобы до них добраться снаружи нужен getter, чтобы им присваивать нужен setter. Я почитал что вещь довольно новая и как-то не рискнул. |
НИпотеме. А вот в php сеттеры и геттеры это капец какая халява. Это же еба...шся проверять isset'ом туевую хучу пропертей в рендере. Ну вот, делается 1 геттер типа
protected function __get($name){ if(array_key_exists($name,$this->_d)) return $this->_d[$name]; else return null; } и потом значит повсюду if($this->value), или там if($name=$this->name). Как обычно в бочке - ложка: нормально нельзя получить референс через геттер и нельзя присвоить значение элементу массива в такой вот недоступной переменной, которая array. Если же все это николебет - то голимая лафа. А вот писать везде if(typeof some_var === 'undefined') меня уже подзаебало. JS же в упор не хочет отвечать за вложение больше 1 глубиной. На php if(isset(arr['one']['two']['three']['four']))... на js - х нанэ. Или как-то делается? |
Часовой пояс GMT +3, время: 01:10. |