2017-11-11 70 views
0

我有一个原型Fill对象预计性能

class Animal() { 
    constructor(name, weight) { 
     this.name = name 
     this.weight = weight 
    } 
} 

和一些未来的对象,其中包含这些属性加点别的

const obj = { 
    name: "name", 
    weight: 5, 
    someRedundantProp: "bla" 
} 

我真的很喜欢JS测绘与Object.assign这将一般创建一个对象与我所有的属性,但在这里我想填补这个新的对象只有重要的领域。 当然,我可以映射这个对象像

new Animal(obj.name, obj.weight) 

,但如果在某些时候我会引入新的属性,我将不得不改变这里的代码,我不想。

有没有更好的方法?

+0

'构造(OBJ){this.name = obj.name; ...' – JJJ

+0

_“但在这里我想填补这个新的对象只有必要的领域”_ - 然后_define_什么“重要领域”是。他们是Animal类已经“拥有”的实际属性吗?然后正确地声明它们,以便您可以遍历它们(以.hasOwnProperty开头),然后挑选出想要“复制”的相同名称的输入对象属性 – CBroe

+0

@CBroe,必需的是构造函数期望的字段 –

回答

0

你可以检查,如果第一个参数是一个对象,然后将对象分配到这一点。

但请注意,这也有一些令人讨厌的副作用。

class Animal { 
 
    constructor(obj) { 
 
    // Create an object that holds all available options 
 
    const defaultOptions = { 
 
     name: '', 
 
     weight: 0, 
 
    }; 
 
    
 
    // Go over all available options 
 
    Object.keys(defaultOptions).forEach(key => { 
 
     // Check if obj has key, otherwise use default option 
 
     this[ key ] = obj[ key ] || defaultOptions[ key ]; 
 
    }); 
 
    } 
 
} 
 

 
const obj = { 
 
    name: "name", 
 
    weight: 5, 
 
    someRedundantProp: "bla" 
 
} 
 

 
const a = new Animal(obj); 
 
console.log(a);

+0

,在这种情况下,它将包含所有属性,不是吗?包括一些RedundantProp –

+0

是的。哦,对不起,你只想要允许某些属性?如果是这样,那么可能有另一个好的解决方案 – lumio

+0

是的:)这是一个意图 –

1

这应该为你工作:

class Animal { 
    constructor(obj) { 
     const defaultFields = { 
      name: "", 
      weight: 0 
     } 
     Object.keys(defaultFields).forEach(key => defaultFields[key] = obj[key]); 
     Object.assign(this, defaultFields); 
    } 
} 
+0

'reduce'看起来有点矫枉过正:)为什么不直接使用'forEach'并直接指定字段呢? – lumio

+0

有没有创建** expectedFields **而不是使用** Object.keys ** –

+0

@VladHatko在哪里指定那些键? – stybl

0

我来到这个解决方案现在

let animal = new Animal() 
Object.keys(animal).forEach(field => animal[field] = obj[field])