JavaScript: лить объект в класс? [Дубликат]

Если мы используем Java 7 и выше, а также знаем, какой контент будет добавлен (добавлен) в файл, мы можем использовать метод newBufferedWriter в пакете NIO.

   public static void main (String [] args) {Путь FILE_PATH = Paths.get ("C: / temp", "temp.txt");  String text = "\n Добро пожаловать в Java 8";  // Запись в файл temp.txt try (BufferedWriter writer = Files.newBufferedWriter (FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {writer.write (текст);  } catch (IOException e) {e.printStackTrace ();  }}  

Следует отметить несколько замечаний:

  1. Всегда хорошая привычка указывать кодировку кодировки и для этого мы имеем константу в классе ] StandardCharsets .
  2. В коде используется команда try-with-resource , в которой ресурсы автоматически закрываются после попытки.

] Хотя OP не спросил, но на всякий случай мы хотим искать строки с определенным ключевым словом, например privacy мы можем использовать потоковые API в Java:

  // Чтение из файла первой строки, содержащей слово «конфиденциальный», try {Stream & lt; String & gt;  lines = Files.lines (FILE_PATH);  Дополнительно & Lt; & Строка GT;  containsJava = lines.filter (l- & gt; l.contains («конфиденциально»)) findFirst ();  if (содержитJava.isPresent ()) {System.out.println (содержитJava.get ());  }} catch (IOException e) {e.printStackTrace ();  }  

34
задан bobo 5 January 2012 в 04:26
поделиться

5 ответов

Ответ @PeterOlson может быть обработан в тот же день, но выглядит как Object.create. Я бы пошел на путь-конструктор, как @ user166390, говорится в комментариях. Причина, по которой я некроментировал этот пост, состоит в том, что мне нужна такая реализация.

В настоящее время мы можем использовать Object.assign ( кредиты для решения @SayanPal ) & amp; Синтаксис ES6:

class Person {
  constructor(obj) {
    obj && Object.assign(this, obj);
  }

  getFullName() {
    return `${this.lastName} ${this.firstName}`;
  }
}

Использование:

const newPerson = new Person(person1)
newPerson.getFullName() // -> Freeman Gordon

Ответ ES5 ниже

function Person(obj) {
    for(var prop in obj){
        // for safety you can use the hasOwnProperty function
        this[prop] = obj[prop];
    }
}

Использование:

var newPerson = new Person(person1);
console.log(newPerson.getFullName()); // -> Freeman Gordon

Используя более короткую версию, 1.5 liner:

function Person(){
    if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop];
}

jsfiddle

27
ответ дан A1rPun 16 August 2018 в 02:33
поделиться
  • 1
    +1 для использования некромантинга в качестве глагола. – Kristopher 6 August 2014 в 22:29
  • 2
    Подставки для «1,5-футового» версия, люблю его. – Ben Guild 3 November 2016 в 14:45
  • 3
    Но этот ответ на самом деле просто пишет функцию extend, которую имеют большинство фреймворков ... И Object.assign заменяет эту функцию ... На сегодняшний день. только Internet Explorer и Safari & lt; = 9 не поддерживают его. Что бы я сделал, это захватить Object.assign polyfill и использовать его, когда реального объекта Object.assign там нет. В моем проекте у меня есть фрагмент кода, который проверяет необходимые функции и, если они отсутствуют, загружает второй скрипт с полиполнами в нем для этих функций. – Stijn de Witt 31 January 2017 в 13:00
  • 4
    @StijndeWitt Я должен согласиться с использованием Object.assign над этим решением. См. Решение @ SayanPal, которое использует метод assign. Я когда-нибудь обновлю этот ответ;) – A1rPun 2 February 2017 в 13:57
  • 5
    @StijndeWitt Пришло время обновить мой ответ! Я видел силу Object.assign – A1rPun 5 September 2017 в 14:01

Нет.

Но если вы хотите обработать свой объект person1, как если бы это был Person, вы можете вызвать методы на прототипе Person на person1 с call:

Person.prototype.getFullNamePublic = function(){
    return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);

Хотя это явно не будет работать для привилегированных методов, созданных внутри конструктора Person, подобно вашему getFullName методу.

6
ответ дан Adam Rackis 16 August 2018 в 02:33
поделиться

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

CustomObject.create = function (obj) {
    var field = new CustomObject();
    for (var prop in obj) {
        if (field.hasOwnProperty(prop)) {
            field[prop] = obj[prop];
        }
    }

    return field;
}

Используйте это как

var typedObj = CustomObject.create(genericObj);
1
ответ дан Obi Onuorah 16 August 2018 в 02:33
поделиться

Это всего лишь завершение ответа Саян Пэла в более короткой форме, стиль ES5:

var Foo = function(){
    this.bar = undefined;
    this.buzz = undefined;
}

var foo = Object.assign(new Foo(),{
    bar: "whatever",
    buzz: "something else"
});

Мне это нравится, потому что он ближе всего к самой опрятной инициализации объекта в .Net:

var foo = new Foo()
{
    bar: "whatever",
    ...
0
ответ дан pasx 16 August 2018 в 02:33
поделиться

Это не совсем ответ, скорее, обмен моими выводами, и, надеюсь, вы получите какой-то критический аргумент для / против него, поскольку я точно не знаю, насколько он эффективен.

Недавно мне нужно было сделайте это для моего проекта. Я сделал это, используя Object.assign , точнее это делается примерно так: Object.assign(new Person(...), anObjectLikePerson).

Вот ссылка на мой JSFiddle и также основная часть кода:

function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;

  this.getFullName = function() {
    return this.lastName + ' ' + this.firstName;
  }
}

var persons = [{
  lastName: "Freeman",
  firstName: "Gordon"
}, {
  lastName: "Smith",
  firstName: "John"
}];

var stronglyTypedPersons = [];
for (var i = 0; i < persons.length; i++) {
  stronglyTypedPersons.push(Object.assign(new Person("", ""), persons[i]));
}
3
ответ дан Sayan Pal 16 August 2018 в 02:33
поделиться
Другие вопросы по тегам:

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