Почему я должен использовать & ldquo; new & rdquo; при создании объекта в javascript? [Дубликат]

Вы можете использовать этот скрипт .

*! > input[type=text] { background: #000; }

Это позволит выбрать любого родителя текстового ввода. Но подождите, еще многое. Если вы хотите, вы можете выбрать указанного родителя:

.input-wrap! > input[type=text] { background: #000; }

или выбрать его, когда он активен:

.input-wrap! > input[type=text]:focus { background: #000; }

Посмотрите этот HTML:

Your name sir

вы можете выбрать span.help, когда активен input и показать его:

.input-wrap! .help > input[type=text]:focus { display: block; }

Есть еще много возможностей; просто проверьте документацию плагина.

BTW, он работает в IE.

37
задан Michał Perłakowski 13 November 2016 в 00:38
поделиться

2 ответа

Оператор new использует внутренний метод [[Construct]] , и он в основном делает следующее:

  • Инициализирует новый собственный объект
  • Устанавливает внутренний [[Prototype]] этого объекта, указывая на свойство Function prototype. Если свойство функции prototype не является объектом (примитивные значения, такие как Number, String, Boolean, Undefined или Null), вместо этого используется Object.prototype.
  • После создания объекта он вызывает функцию, предоставляя объект в качестве значения this.
  • Если возвращаемое значение вызываемой функции является примитивным, созданный объект внутренне возвращается.
  • В противном случае, если объект возвращается, объект, созданный внутри, теряется.

Эквивалентная реализация того, что делает оператор new, может (при условии, что доступен метод ECMAScript 5 Object.create):

function NEW(f) {
  var obj, ret, proto;

  // Check if `f.prototype` is an object, not a primitive
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Create an object that inherits from `proto`
  obj = Object.create(proto);

  // Apply the function setting `obj` as the `this` value
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  if (Object(ret) === ret) { // the result is an object?
    return ret;
  }
  return obj;
}

// Example usage:
function Foo (arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
obj.prop;          // 'bar'
obj.inherited;     // 'baz'
obj instanceof Foo // true
48
ответ дан CMS 17 August 2018 в 14:20
поделиться
  • 1
    Было бы безопасно заменить Object.create (proto) на & gt; var newObj = {}; newObj.prototype = proto; ? – PicoCreator 20 July 2011 в 02:11
  • 2
    @ pico.creator: Нет, свойство prototype имеет смысл только для объектов Function, при использовании в качестве конструкторов и использования конструктора в моем примере реализации new, было бы необходимо использовать оператор new в любом случае .. Единственным способом было бы использовать свойство __proto__, но оно нестандартно и оно устарело. См. этот ответ , в котором я объясняю разницу между свойством prototype объектов функции и свойством internal [[Prototype]], что все объекты формируют цепочку прототипов. – CMS 20 July 2011 в 07:37
  • 3
    Двойное использование этого термина, безусловно, запутывает. Однако ответ оставил настройку конструктора объекта; Причина из моих экспериментов, похоже, что функция конструктора клонируется, применяется и добавляется к результату .constructor. – PicoCreator 21 July 2011 в 08:13
  • 4
    Я предполагаю, что arguments в этом примере должны быть f .. или я что-то упускаю? – max 8 July 2015 в 19:49

Выражение new C(arg1, arg2):

Предполагая, что C является функцией JavaScript (иначе вы получите сообщение об ошибке):

  1. Создает новый пустой объект (без свойств)
  2. Устанавливает прототип нового объекта в значение свойства [prototype "C. Примечание. Значение по умолчанию для функции prototype для объекта - это объект (автоматически созданный при объявлении функции), с его прототипом, установленным на Object.prototype и свойство constructor, указывающим на функцию C. Примечание. Терминология может вводить в заблуждение. Свойством, названным «прототипом», является не так же, как прототип объекта. Только функции имеют свойство «прототип», но все объекты имеют прототип.
  3. Вызывает функцию C с параметром 'this', установленным для нового объекта, и с прилагаемыми аргументами.
  4. Если вызов функции C возвращает объект, этот объект является результатом выражения. В противном случае вновь созданный объект является результатом выражения.

Альтернативой new в ECMAScript 5 будет использование встроенного метода Object.createObject.

new C(arg1, arg2) будет эквивалентен:

var obj = Object.createObject(C.prototype);
C.apply(obj, [arg1, arg2]);

Стандартный JavaScript не позволяет вам явно установить прототип объекта, поэтому Object.createObject не может быть реализован на самом языке. Некоторые реализации позволяют это через нестандартное свойство __proto__. В этом случае new C можно моделировать следующим образом:

var obj = {};
obj.__proto__ = C.prototype;
C.apply(obj, [arg1, arg2]);
8
ответ дан JacquesB 17 August 2018 в 14:20
поделиться
  • 1
    Примечание по точке №2: Значение по умолчанию для свойства prototype любой функции, определенной пользователем, является объектом, который содержит свойство constructor, которое ссылается на саму функцию и наследует ее от Object.prototype. Этот объект инициализируется при создании объектов функции . О Object.create, это может быть просто частично , эмулированное на ES3, установка свойства [[Prototype]] может быть выполнена с помощью временного конструктора, но да, это невозможно полностью эмулировать, подробнее . Приветствия. – CMS 20 July 2011 в 08:38
Другие вопросы по тегам:

Похожие вопросы: