Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2020, 19:32
Аспирант
Отправить личное сообщение для korih Посмотреть профиль Найти все сообщения от korih
 
Регистрация: 02.06.2016
Сообщений: 36

добавить в цепочку прототипов объекта {} функцию
Добрый вечер всем.
возник у меня глупый вопрос который ни как не могу реализовать.
как добавить глобально в цепочку прототипов объектов конкретно {}, что бы к примеру был результат при:
const obj = {a:1}
console.log(obj)
//{a:1} -> __proto__ -> myProtoFunction: f()

const arr = [1,2,3]
console.log(arr)
//[1,2,3] -> ... -> в цепочке прототипов myProtoFunction() не имеется

//и так с остальными конструкциями


я пытался сделать следующим образом:
Object.defineProperty(Object.prototype, 'isObject', {
  value: function() {
      if(!Boolean(this instanceof Array) && typeof this === 'object' && this !== null && this !== undefined){
        return true
      }else{
        return false
      }
  },
  enumerable: false
});


но проблема в том, что все в js это объекты, и если вызвать массив, то в цепочке прототипов окажется моя функция 'isObject'.

надеюсь объяснил корректно, хотелось бы услышать какие-нибудь варианты и решения данной задачи. Заранее спасибо

Последний раз редактировалось korih, 17.03.2020 в 19:47.
Ответить с цитированием
  #2 (permalink)  
Старый 17.03.2020, 20:19
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

korih,
Зачем тогда на массив проверять (this instanceof Array) внутри isObject?
Ответить с цитированием
  #3 (permalink)  
Старый 17.03.2020, 20:21
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

взял здесь - https://developer.mozilla.org/en-US/...rototype_chain
...
Performance
The lookup time for properties that are high up on the prototype chain can have a negative impact on the performance, and this may be significant in the code where performance is critical. Additionally, trying to access nonexistent properties will always traverse the full prototype chain.
...
Bad practice: Extension of native prototypes
One misfeature that is often used is to extend Object.prototype or one of the other built-in prototypes.

This technique is called monkey patching and breaks encapsulation. While used by popular frameworks such as Prototype.js, there is still no good reason for cluttering built-in types with additional non-standard functionality.


...
In conclusion
It is essential to understand the prototypal inheritance model before writing complex code that makes use of it. Also, be aware of the length of the prototype chains in your code and break them up if necessary to avoid possible performance problems. Further, the native prototypes should never be extended unless it is for the sake of compatibility with newer JavaScript features.

...

const obj = { a: 1 }
function myFoo() {
  console.log(this.a)
}
const myFooInstance = myFoo.bind(obj)
myFooInstance()
myFoo.call(obj)
myFoo.apply(obj)


) не ответ на конкретный вопрос...
Ответить с цитированием
  #4 (permalink)  
Старый 17.03.2020, 21:54
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

Можно поставить геттер и проверять что прототип - прототип объекта. Но это всё хрень. В javascript всё объекты и всё может быть использовано как объект.

Вам просто нужно сделать свой класс с нужным протипом, и создавать объекты этого класса.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 17.03.2020, 21:57
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Object.defineProperty(Object.prototype, 'isObject', {
    value: function () {
      return 'v'
    }
  })

  var o = { a: 1 };

  console.log(o.isObject())

  var a = [1, 23]

  console.log(a.hasOwnProperty('isObject'))
Ответить с цитированием
  #6 (permalink)  
Старый 17.03.2020, 22:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

SuperZen, ты это к чему? "о" точно также не имеет "OwnProperty", а "a" точно также может сделать "isObject()".
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 17.03.2020, 22:20
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

SuperZen,
Судя по названию isObject это статический метод, просто автор не прав с прототипами, читать интерфейс вася.аНеВасяЛиЯ() абсурд. Например, есть Array.isArray(value), можно сделать Object.isPlainObject(value), тогда норм Васи.аНеВасяЛи(Он).

Последний раз редактировалось Rise, 17.03.2020 в 22:31.
Ответить с цитированием
  #8 (permalink)  
Старый 18.03.2020, 11:24
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Aetae, hasOwnProperty не смотрит на prototype, угу...

тогда выбор не большой, проверить что this имеет ф-ции из Array, но тогда может что-нибудь другое перестать работать... )
Object.defineProperty(Object.prototype, 'isObject', {
  value: function () {
    if (typeof this.find === 'function') { 
      return 'array'
    }
    return 'object'
  }
})

var o = { a: 1 };

console.log(o.isObject())

var a = [1, 23]

console.log(a.isObject())


вообще кто-нибудь видел, знает есть ли они вообще такие люди, которые без справочника все это помнят и действительно знают как это все работает? видел тут на форуме кто-то писал, что он прочитал спецификацию ecmascript, одно дело прочитать, другое знать... это не риторический вопрос ), где они эти люди дайте хоть б... фотку посмотреть

Последний раз редактировалось SuperZen, 18.03.2020 в 11:29.
Ответить с цитированием
  #9 (permalink)  
Старый 18.03.2020, 18:12
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,709

Сообщение от SuperZen Посмотреть сообщение
Aetae, hasOwnProperty не смотрит на prototype, угу...

тогда выбор не большой, проверить что this имеет ф-ции из Array, но тогда может что-нибудь другое перестать работать... )
Object.defineProperty(Object.prototype, 'isObject', {
  value: function () {
    if (typeof this.find === 'function') { 
      return 'array'
    }
    return 'object'
  }
})

var o = { a: 1 };

console.log(o.isObject())

var a = [1, 23]

console.log(a.isObject())

Смотря что нужно считать object-ом
Если только Array - не object

Но

var a = function () {}
var b = new RegExp ('d+')
var c = new Number(123)
console.log(a.isObject())
console.log(b.isObject())
console.log(c.isObject())
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к переменной внутри объекта, в произвольной функцию через его метод platedz Элементы интерфейса 15 25.08.2012 00:03
Как при чтении или записи свойства объекта вызывать функцию danik.js Общие вопросы Javascript 3 16.09.2010 17:57
Как в JavaScript присвоить функцию свойству объекта? kokon Общие вопросы Javascript 5 25.05.2010 22:11
Можно ли использовать функцию в качестве свойства свободно позиционируемого объекта Newgen Общие вопросы Javascript 0 24.07.2009 23:02
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00