#javascript
#javascript
Вопрос:
Я хочу знать, имеет ли функция определенное свойство. оператор ‘in’ должен был выполнить всю работу: цитата MSD:
Оператор in возвращает true, если указанное свойство находится в указанном объекте или его цепочке прототипов.
Итак, не могли бы вы, пожалуйста, объяснить результат этого кода?
function Shape() {
aaa = 10
}
Shape.prototype.bbb = 20
function Square() {}
Square.prototype = Object.create(Shape.prototype)
Square.prototype.constructor = Square;
console.log('aaa' in Shape) // false???
console.log('bbb' in Shape) // false???
console.log('aaa' in Square) // false???
console.log('bbb' in Square) // false???```
Комментарии:
1. Ты бы не сделал
'aaa' in Shape
, ты бы сделалvar x = new Shape(); 'aaa' in x
2. Я хочу задать его функции, а не объекту, созданному функцией
3. и это должно было сработать, поскольку функция также является объектом
4. Да, функция также является объектом, и у этого объекта нет
'aaa'
свойства, илиbbb
, или любого другого5. Да, это так — в цепочке свойств — так что цитата MSD применима и к этому случаю
Ответ №1:
in
не проверяет свойства на class
себе. Он проверяет наличие свойств в экземпляре класса.
function Shape() {
aaa = 10
}
Shape.prototype.bbb = 20
function Square() {}
Square.prototype = Object.create(Shape.prototype)
Square.prototype.constructor = Square;
const instance = new Square();
console.log('aaa' in instance) // false
console.log('bbb' in instance) // true
Здесь, когда вы присваиваете свойства прототипу определенного function
, это не означает, что функция будет обладать этими свойствами. Эти свойства в прототипах добавляются к экземплярам, созданным объектами.
Да, если вы присвоите свойство самой функции, тогда оно покажет использование in
function test(){
}
test.prototype.x = 3;
test.something = 5
console.log(Object.keys(test)) //["something"]
console.log("something" in test) //true
Комментарии:
1. Здесь нет «класса». только функции, которые также являются объектами — так что это должно было сработать
2. @DuduArbel Я добавил вторую часть. Если у вас остались какие-либо вопросы, не стесняйтесь задавать
3. @DuduArbel И здесь функция просто работает как класс.
4. Позвольте мне уточнить мой вопрос. У меня есть функция. могу ли я узнать, определено ли свойство каким- либо образом в экземпляре этой функции без создания экземпляра
5. @DuduArbel Для этого нет единого метода. Вам придется использовать
"property" in func || "property" in func.prototype
.