Object.assign
在RN的开发版本上失败(在上面的链接的注释中进行了解释)。问题是我的一个节点模块触发了这种特定情况。出于这个原因,我需要填充。
我正在尝试填充自己的Object.assign
(基于此https://github.com/facebook/react-native/blob/1151c096dab17e5d9a6ac05b61aacecd4305f3db/Libraries/polyfills/Object.es6.js,除非不检查现有的内容)
当我从节点模块中注销global
时,我可以看到它指向我的代码
Object: ƒ Object()
arguments: (...)
assign: ƒ assign(target, varArgs)
arguments: (...)
caller: (...)
length: 2
name: "assign"
prototype: {constructor: ƒ}
__proto__: ƒ ()
[[FunctionLocation]]: objectAssign-polyfill.js:2
[[Scopes]]: Scopes[1]
但是,节点模块似乎仍在使用自己的Object.assign
而不是我的多填充模块。
当我修改节点模块中的代码以使用global.Object.assign
时,它似乎终于可以工作了。但是,有没有一种方法可以不这样做(因为那样的话我就必须在所有地方都这样做)?
代码如下:
// objectAssign-polyfill.js
Object.defineProperty(Object, 'assign', {
value: function assign(target, varArgs) {
'use strict';
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
let to = Object(target);
for (let index = 1; index < arguments.length; index++) {
let nextSource = arguments[index];
if (nextSource != null) {
for (let nextKey in nextSource) {
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true,
});
// shims.js
import "node-libs-react-native/globals";
import './objectAssign-polyfill'
import { btoa } from "Base64";
import nodeUrl from 'url';
global.btoa = btoa;
global.URL = class URL {
constructor(url) {
return nodeUrl.parse(url)
}
}
// index.js (the root of my RN app)
/** @format */
import "./shims";
import { AppRegistry } from "react-native";
import Core from "./Core";
import { name as appName } from "./app.json";
AppRegistry.registerComponent(appName, () => Core);