未定义原型创建的新对象

时间:2016-12-02 04:13:42

标签: javascript object prototype

我正在研究笛卡尔坐标库,我尝试简单地创建一个类,定义原型并创建实例。

但是在这个简单的例子中,我的笛卡尔对象上没有任何方法。

let Cartesian = function(instance, opts) {
  let pos = opts.pos || {x:0, y: 0}
  /* .. Logic here .. */
  return {pos: pos}
}

console.log("Before : ", Cartesian.prototype.getPosition)

Cartesian.prototype.getPosition = function() {
  return true
}

console.log("After : ", Cartesian.prototype.getPosition)

CartesianExport = {
  create: function (instance, opts) {
    console.log("Create new : ", Cartesian.prototype.getPosition)
    let c = new Cartesian(instance, opts)
    console.log("Created : ", c, c.getPosition)
    return c
  }
}

module.exports = CartesianExport

这是我的控制台

Before : undefined
After : function () { return true }
Create new : function () { return true }
Created :  Object {pos: Object} undefined

我不明白为什么当我尝试使用它时我得到cartesian.getPosition is not a function

2 个答案:

答案 0 :(得分:0)

使用此:

function Cartestian(opts) {
  this.pos = opts.pos || {x: 0, y: 0};
}

当您在构造函数中说return {pos: pos};时,将返回无原型对象{pos: pos}而不是Cartesian的新实例。使用返回的值重写实例。所以new Cartesian(...)在没有原型的情况下评估对象。这就是我的意思:

function IncorrectlyDefined(obj) {
  return obj;
}

var someObj = {x: 0, y: 0};
var x = new IncorrrectlyDefined(someObj);
// x === someObj

答案 1 :(得分:-3)

没有Cartesian.getPosition函数的声明,只有你的获取未定义。所以你可以声明函数c.getPosition函数你可以得到那个.data