520, процесс обучения тратить новые объекты

JavaScript

предисловие

Как мы все знаем, нужно три шага, чтобы положить слона в холодильник, открыть холодильник, положить туда слона и закрыть холодильник. тогда ты знаешь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Вызов конструктора выполняет следующие шаги.

  1. Создайте новый объект в памяти.
  2. Внутри этого нового объекта[[Prototype]]Указатель присваивается конструкторуprototypeАтрибуты.
  3. внутри конструктораthisприсваивается этому новому объекту (т.е.thisуказать на новый объект).
  4. Выполнить код внутри конструктора (добавить свойства в новый объект).
  5. еслиЕсли конструктор возвращает ненулевой объект, он возвращает объект; в противном случае возвращает только что созданный новый объект.

[[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).

над.