предисловие
Как мы все знаем, нужно три шага, чтобы положить слона в холодильник, открыть холодильник, положить туда слона и закрыть холодильник. тогда ты знаешьnew
Сколько шагов проходит объект? В это время может появиться умный братишка, который скажет: «У меня пять девочек, что мне еще нужно?» Кекеке…, этот предмет не другой предмет, сегодня мы говорим оJavascript
объект в.
Конструктор
в операцииnew
Перед объектом мы должны понять, что такое конструктор.
обычный конструктор
Единственная разница между конструкторами и обычными функциями заключается в способе их вызова. Кроме того, конструкторы — это функции. Специального синтаксиса для определения функции как конструктора не существует. Любая функция просто используетnew
Вызов оператора — это конструктор (За исключением стрелочных функций, стрелочные функции нельзя использовать в качестве конструкторов, используйтеnew
выдаст ошибку.) Вместо того, чтобы использоватьnew
Функция, вызываемая оператором, является нормальной функцией. Конструкторы обычно пишутся с большой буквы. Давайте создадимGirlFirend
пытаться.
function GirlFirend(name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this.name);
};
// do something...
}
// 作为构造函数
let xiaoMei = new GirlFirend('Xiao Mei', 18);
xiaoMei.sayName(); // Xiao Mei
// 作为函数调用
GirlFirend('Xiao Mei', 18)
window.sayName() // Xiao Mei
о том, почемуXiao Mei
а такжеwindow
беги и смотри"что это "это""
Мы знаем, что всякий раз, когда создается функция, для этой функции создается функция в соответствии с определенными правилами.prototype
Свойства (объекты-прототипы). По умолчанию все объекты-прототипы автоматически получаютconstructor
свойство, указывающее на связанный с ним конструктор. Для приведенного выше примераGirlFirend.prototype.constructor
направлениеGirlFirend
. мы пытаемся сделатьGirlFirend
Расскажите о своих увлечениях.
function GirlFirend(name, age) {
// do something...
}
GirlFirend.prototype.sayHobby = function () {
console.log('I like sports');
};
let xiaoMei = new GirlFirend('Xiao Mei', 18);
xiaoMei.sayHobby(); // I like sports
Теплое напоминание: ваш объект может быть не тем, что вы видите на поверхности, давайте посмотрим на следующий пример.
function GirlFirend(name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this.name);
};
// 如果这里 return 'Tomboy',最后的结果还是 'Xiao Mei'
return {
name: 'Tomboy',
age: 30,
sayName: function() {
console.log(this.name)
}
}
}
let xiaoMei = new GirlFirend('Xiao Mei', 18);
xiaoMei.sayName(); // Tomboy,这里的对象就成了构造函数返回的对象
конструктор класса
Внутри блока определения классаconstructor
Ключевое слово используется для создания конструктора класса. имя методаconstructor
скажет переводчик
В использованииnew
Эту функцию следует вызывать, когда оператор создает новый экземпляр класса.
Основное различие между конструктором класса и конструктором заключается в том,Вызов конструктора класса должен использовать new
оператор. И нормальный конструктор, если
Не используйтеnew
вызов, затем глобальныйthis
(как правилоwindow
) как внутренний объект.
class GirlFirend {
constructor(name) {
// 添加到 this 的所有内容都会存在于不同的实例上
this.name = name
}
}
let xiaoMei = new GirlFirend('Xiao Mei');
console.log(xiaoMei.name); // Xiao Mei
При доступе к свойству через объект поиск начинается с имени свойства. Поиск начинается с самого экземпляра объекта. Если заданное имя найдено в этом экземпляре, возвращается значение, соответствующее этому имени. еслиПосле того, как это свойство не будет найдено, свойства будут найдены объектом-прототипом, а затем вернут соответствующее значение..
class GirlFirend {
constructor(name) {
// 添加到 this 的所有内容都会存在于不同的实例上
this.name = name
}
// 定义在类的原型对象上
sayName() {
console.log(this.name);
}
// 定义在类本身上
static sayHobby() {
console.log('I like sports');
}
}
let xiaoMei = new GirlFirend('Xiao Mei');
console.log(xiaoMei.name); // Xiao Mei
xiaoMei.sayName(); // Xiao Mei
GirlFirend.sayHobby(); // I like sports
Примечание. Статические методы, определенные в классе, относятся только к самому классу, а не к экземпляру или прототипу.
Роль новых
new
Используется для создания экземпляра пользовательского типа объекта или экземпляра встроенного объекта с помощью конструктора.
Из предыдущих примеров нетрудно увидеть, что использованиеnew
Вызов конструктора выполняет следующие шаги.
- Создайте новый объект в памяти.
- Внутри этого нового объекта
[[Prototype]]
Указатель присваивается конструкторуprototype
Атрибуты. - внутри конструктора
this
присваивается этому новому объекту (т.е.this
указать на новый объект). - Выполнить код внутри конструктора (добавить свойства в новый объект).
- еслиЕсли конструктор возвращает ненулевой объект, он возвращает объект; в противном случае возвращает только что созданный новый объект.
[[prototype]]
Свойство скрыто, но большинство новых реализаций браузеров в настоящее время используют__proto__
Представлять. конструкторprototype
Свойства, к которым мы можем получить явный доступ.
внедрять новые
Наконец, мы следуем предыдущим идеям для реализацииnew
Бар.Уведомление:ES6 class
должно быть черезnew
создавать экземпляр
function _new(fn, ...arg) {
const obj = Object.create(fn.prototype);
const newObj = fn.apply(obj, arg);
return newObj instanceof Object ? newObj : obj;
}
// 使用的例子:
function GirlFirend(name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this.name);
};
}
const xiaoMei = _new(GirlFirend, 'Xiao Mei', 18)
console.log(xiaoMei) // GirlFirend {name: "Xiao Mei", age: 18, sayName: ƒ}
Object.create(proto, [propertiesObject])
метод создает новый объект, используя существующий объект, чтобы предоставить только что созданному объекту__proto__
. Он принимает два параметра, но вторым необязательным параметром является дескриптор атрибута (обычно не используется, по умолчаниюundefined
).
над.