当我发现ES5 getter
feature时,我正在寻找一种自我引用对象来访问它的属性的方法(参见。MDN)。
我正在使用NPM模块,无法访问canvas
属性。
import path from "path";
import layout from "./layouts";
const config = {
canvas: { width: 80, height: 80 },
layout: {
get base() {
console.log(this);
console.log(this.canvas);
return layout.base.bottom(this.canvas);
},
get annotation() {
return layout.annotation.top(this.canvas);
}
}
};
export default config;
export default {
annotation: {
top: options => ({
x: options.width / 2,
})
},
base: {
bottom: options => ({
x: options.width / 2,
})
}
};
{ base: [Getter], annotation: [Getter] }
undefined
TypeError: Cannot read property 'width' of undefined
at Object.bottom (/data/projects/hanzi-pinyin-font/src/layouts.js:13:10)
at Object.get base [as base] (/data/projects/hanzi-pinyin-font/src/config.js:17:26)
at generateSvg (/data/projects/hanzi-pinyin-font/index.js:15:40)
at /data/projects/hanzi-pinyin-font/index.js:39:5
at /data/projects/hanzi-pinyin-font/node_modules/jsonfile/index.js:46:5
为什么这不起作用?
答案 0 :(得分:2)
您有嵌套的对象文字。内部layout
对象文字不知道它有父文件,因此this
的getter中的layout
引用config.layout
。
您可以使用对象速记语法来改善它。
import path from "path";
import layouts from "./layouts";
const canvas = {
canvas: { width: 80, height: 80 }
}
const layout = {
get base() {
return layouts.base.bottom(canvas);
},
get annotation() {
return layouts.annotation.top(canvas);
}
}
export default {
canvas, layout
};
答案 1 :(得分:1)
.canvas
不是layout
对象的属性,而是config
对象的属性,因此您无法使用this
(引用layout
来访问它,如您的日志所示)。相反,使用
import path from "path";
import layout from "./layouts";
export default const config = {
canvas: { width: 80, height: 80 },
layout: {
get base() {
return layout.base.bottom(config.canvas);
},
get annotation() {
return layout.annotation.top(config.canvas);
}
}
};
答案 2 :(得分:0)
正如@Chris所解释的那样,this
并未引用我的顶级对象config
,而是父对象layout
。
向上移动吸气剂可以解决这个问题。
const config = {
get layout() {
return {
base: layout.base.bottom(this.canvas),
annotation: layout.annotation.top(this.canvas)
};
}
}