相关疑难解决方法(0)

Javascript对象继承

请帮助我理解这段代码.

var person = {
    'first-name': 'FirstName',
    'last-name': 'LastName',
    'gender': 'Male'
};

var anotherPerson = new Object(person);
anotherPerson.desig = 'Designation';

console.log('Another person designation: ' + anotherPerson['desig'] + ', person designation: ' + person['desig']);
Run Code Online (Sandbox Code Playgroud)

我期待输出,Another person designation: Designation, person designation: undefined但令我惊讶的是我发现它`Another person designation: Designation, person designation: Designation.

根据我的说法,anotherPerson扩展person对象和属性设置anotherPersonperson对象不应该是可见的.我错了吗?或者这两个对象都指向同一个位置?

[编辑]

现在还有更多的惊喜.

我在上面添加了以下代码.

person.place = 'XYZ';
console.log(person['place'] + ', ' + anotherPerson['place']); // Expected: XYZ, undefined. Result: XYZ, XYZ.
Run Code Online (Sandbox Code Playgroud)

基于上述结果和答案,我认为两个对象都指的是同一个位置.现在我添加了几行

person …
Run Code Online (Sandbox Code Playgroud)

javascript oop object

5
推荐指数
1
解决办法
1660
查看次数

如何为JavaScript对象设置类名

我有一些测试课

TestKlass = (function() {

    function TestKlass(value) {
      this.value = value != null ? value : 'hello world';
      console.log(this.value);
    }

    return TestKlass;

})();

x = new TestKlass;
x instanceof TestKlass; (gives true)
Run Code Online (Sandbox Code Playgroud)

我有新的空物

y = {}
y instanceof Object
Run Code Online (Sandbox Code Playgroud)

我能找到任何方法来为y设置任何属性,就像这样

y.__proto__ = x.__proto__
y.constructor.prototype = x.constructor.prototype
Run Code Online (Sandbox Code Playgroud)

为了得到这个结果

y instanceof TestKlass => true
Run Code Online (Sandbox Code Playgroud)

================================================== ==

UPD:

所以.我的主要目标 - 创建CLONE功能.现在我的解决方案适合我.请看这段代码:

JavaScript JS对象克隆

Object._clone = function(obj) {
  var clone, property, value;
  if (!obj || typeof obj !== 'object') {
    return obj; …
Run Code Online (Sandbox Code Playgroud)

javascript instanceof ecmascript-5

5
推荐指数
1
解决办法
2561
查看次数

存储对象/变量中的函数引用

我一直在寻找这个,但到目前为止还没有找到重复,我可能使用错误的关键字...

我试图暂时更改存储在对象中的函数,但是无法将其设置回原来的状态.

考虑一下:

// Set the options object
var options = {
    success: function(){
        console.log('Original Function Called');
    }
}

// Save the options
$('#foo').data('bar',options);
Run Code Online (Sandbox Code Playgroud)

然后在另一个功能:

// Get the options
var options = $('#foo').data('bar');

// Store the old options
var old_options = options;

// Temporarily change the success function
options.success = function(){
    console.log('Temporary Function Called');
}

// Save the options
// This allows the other functions to access the temporary function
$('#foo').data('bar',options);

// Do stuff here that uses the new options …
Run Code Online (Sandbox Code Playgroud)

javascript jquery function object

5
推荐指数
1
解决办法
6472
查看次数

对于JavaScript多维数组的深层副本,深入一层似乎就足够了。这是真的吗?

注意:我只是一个新手程序员,所以这个问题的核心可能是明显的错误或误解。

本质上,我需要将JavaScript中的“按值”多维数组深度复制到未知深度。我认为这将需要一些复杂的递归,但是似乎在JavaScript中,您只需要复制一个级别就可以按值复制整个数组。

举个例子,这是我的测试代码,它使用了一个故意卷积的数组。

function test() {
  var arr = [ ['ok1'],[],[ [],[],[ [], [ [ ['ok2'], [] ] ] ] ] ];
  var cloned = cloneArray(arr);
  arr = '';   // Delete the original
  alert ( cloned );
}


function cloneArray(arr) {  
  // Deep copy arrays. Going one level deep seems to be enough.
  var clone = [];
  for (i=0; i<arr.length; i++) {
    clone.push( arr[i].slice(0) )
  }
  return clone;
}
Run Code Online (Sandbox Code Playgroud)

在我运行此测试(Ubuntu上最新稳定的Chrome和Firefox)的过程中,即使删除了原始数组,即使数组最深的部分也似乎已成功通过克隆中的值成功复制,即使slice_()复制”仅深入了一层。这是JavaScript中的标准行为吗?我可以依靠它来运行较旧的浏览器吗?

javascript arrays multidimensional-array

5
推荐指数
1
解决办法
3341
查看次数

Js Array.prototype.map()碰巧是可变的吗?

最初的目的是创建一个新数组时,为什么map方法会改变原始数组?

我有一个对象数组,我传递给一个纯函数,然后映射给定的数组并返回一个新的.然后我注意到原始数组也被改变了.我理解Js中的Object通过引用传递的概念,但是仍然无法抓住为什么实现map会改变原始数组,有点胜过IMO的目的.

var initialArray = [ { name: 'one' }, { name: 'two' }, { name: 'three'} ];

function doSomething(array) {

  // lodash
  // return _.map(array, (item) => _.assign(item, {isSelected: true}));  

  // vanilla
  return array.map(function(item) {
    item['isSelected'] = true;
    return item
  });

}

var changedArray = doSomething(initialArray);

console.log('initialArray', initialArray); // [{ name: 'one', isSelected: true }, ...]
console.log('changedArray', changedArray); // [{ name: 'one', isSelected: true }, ...]
console.log(initialArray === changedArray); // false
Run Code Online (Sandbox Code Playgroud)

首先我想了解为什么会这样?

第二个我喜欢理解如何在不改变原始数组的情况下映射数组?(即._cloneDeep每次 …

javascript arrays mapping mutable immutability

5
推荐指数
1
解决办法
3018
查看次数

在javascript中处理同一属性的多个赋值的最佳方法

情况就是这样:

user.username = body.username;
user.name = body.name;
user.surname = body.surname;
user.email = body.email;
user.password = body.password;
user.privilege = body.privilege;
user.pin = body.pin;
user.rfidTag = body.rfidTag;
Run Code Online (Sandbox Code Playgroud)

我这样修改它,它按预期工作:

for (let propt in body) { 
    user[propt] = body[propt];
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更优雅的方式来写这个,也许有一些属性检查.

[更新]:有多种方法可以解决这个问题.

如果您不需要保留用户属性:

user = Object.assign( {}, body );
Run Code Online (Sandbox Code Playgroud)

或者提案传播财产:

user = { ...body };
Run Code Online (Sandbox Code Playgroud)

否则保留用户的属性:

Object.assign( user, body );
Run Code Online (Sandbox Code Playgroud)

javascript node.js ecmascript-5 ecmascript-6 ecmascript-7

5
推荐指数
1
解决办法
219
查看次数

如何复制数组的最后一个元素?

我有一个长度为 n 的对象数组,我想将其扩展到长度为 n+1。为了便于使用,我想复制最后一个元素,然后更改副本的属性。

let arr = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}];

arr.push(arr[1]);       // extend by copying the last
arr[2].id += 1;         // change the id of the new last
arr[2].name = 'foobar'; // change the name of the new last

console.log(arr);
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中(使用浏览器控制台,因为代码片段控制台在这里的行为有点奇怪)是我尝试过的,但出于某种原因,对复制/新最后一个元素的任何更改也适用于原始/旧最后/新第二个元素-数组中的最后一个元素。

我怎样才能正确地做到这一点,为什么我的代码的行为方式如此?

javascript arrays ecmascript-6

5
推荐指数
1
解决办法
826
查看次数

如何遍历对象中所有唯一的条目对?

我目前有一个像这样迭代的数组数据结构,调用foo每个唯一的元素对。

for(var i = 0; i < arr.length; i++) {
    for(var j = i + 1; j < arr.length; j++) {
        foo(arr[i], arr[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我意识到我宁愿使用对象而不是数组,因为这样我就可以很轻松地按名称添加和删除元素。

但是,我看不到迭代此类对象的明显方法。我能得到的最接近的是:

for(i in obj) {
    for(j in obj) {
        foo(obj[i], obj[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这将使每对执行两次,甚至产生一对相同的元素。是否有一种简单的方法可以像在第一个代码示例中的数组中那样迭代对象?

更新:

jsperf上的解决方案进行性能测试。

javascript iteration javascript-objects

4
推荐指数
1
解决办法
920
查看次数

有没有办法让 lodash 复制属性 getter 和 setter?

在以下情况下,我发现 lodash 似乎没有复制源对象的 getter:

const _ = require("lodash");

let sourceObject = { };
Object.defineProperty(sourceObject, "abc", {
    get: () => 123
});

let cloneObject = _.cloneDeep(sourceObject);

console.log(sourceObject.abc); // 123
console.log(cloneObject.abc);  // undefined
Run Code Online (Sandbox Code Playgroud)

有没有办法用lodash模块实现上述目的?

javascript node.js lodash

4
推荐指数
1
解决办法
3175
查看次数

如何在 javascript/vuejs 中制作对象的副本

我正在使用 js 对象,可以说:

items: [{text: 'text1', active: true},
{text: 'text1', active: true},
{text: 'text1', active: true}]
Run Code Online (Sandbox Code Playgroud)

我想制作对象的副本并在计算属性中对它们进行一些更改,如下所示:

computed: {
   copyAndChange() {
      var itemsCopy = []
      itemsCopy = this.items
      for (var i=0; i<itemsCopy.length; i++) {
         itemsCopy[i].text = "something"
         console.log('text from items: ' + this.item[i])
         console.log('text from itemsCopy: ' + itemsCopy[i])
      }
      return itemsCopy
   }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在控制台中给了我:

text from items: something
text from itemsCopy: something
text from items: something
text from itemsCopy: something
text from items: something
text from itemsCopy: something
Run Code Online (Sandbox Code Playgroud)

(?) …

javascript vue.js

4
推荐指数
1
解决办法
2万
查看次数