我有这段代码
var Point = function (startX, startY) {
var x = startX
var y = startY
}
function somefunc (data) {
var newPoint = new Point(data.x, data.y);
console.log(data.x + ":" + data.y);
console.log(newPoint.x + ":" + newPoint.y);
}
我进入控制台
0:0
undefined:undefined
为什么没有分配newPoint值?
答案 0 :(得分:4)
将var
声明替换为this
访问权限。您需要将属性附加到将通过new
创建的当前对象。如果没有this
,则在调用函数时会创建它们,并在函数调用后删除它们。
var Point = function (startX, startY) {
this.x = startX;
this.y = startY;
}
function somefunc (data) {
var newPoint = new Point(data.x, data.y);
console.log(data.x + ":" + data.y);
console.log(newPoint.x + ":" + newPoint.y);
}
somefunc({x: 1, y: 1});
如果您将函数用作对象创建者, ES6 会提供特殊关键字 - class
,这是 OOP 创建对象的友好方式
class Point {
constructor(startX, startY) {
this.x = startX;
this.y = startY;
}
}
function somefunc (data) {
var newPoint = new Point(data.x, data.y);
console.log(data.x + ":" + data.y);
console.log(newPoint.x + ":" + newPoint.y);
}
somefunc({x: 1, y: 1});
答案 1 :(得分:0)
Javascripts继承可能会让人感到困惑。当您使用purchase_data
调用函数时,它会创建一个新对象,而特殊的new
变量将引用该对象。然后该函数将自动返回this
。因此,要设置该对象的属性,需要将它们分配给this
,因为构造函数的变量不会以任何方式公开:
this
此行为等于:
function Point(x, y){
this.x = x;
this.y = y;
}
但是你也可以使用javascripts function Point(x, y){
var context = {};
context.x = x;
context.y = y;
return context;
}
语法,这可能看起来更合乎逻辑:
class
答案 2 :(得分:0)
您正在声明一个新变量' x'并且' y'内部Point只能在函数内部访问,因为这样的声明变量使它成为局部变量。您可以使用闭包,以便您创建存储在其中的点的每个实例。
var Point = function (startX, startY) {
return {
x: startX,
y: startY
}
}
var newPoint1 = new Point(10, 20);
var newPoint2 = new Point(20, 10);
console.log(newPoint2.x + ":" + newPoint2.y);
console.log(newPoint2.x + ":" + newPoint2.y);
答案 3 :(得分:0)
您错过了new
关键字的神奇之处。
通常,当我们创建一个对象时,当你使用new关键字时,我们不会从函数中显式返回一个对象,就像它对我们一样。
var Point = function (startX, startY) {
var obj = {} // common part
obj.x = startX;
obj.y = startY;
return obj //common part
}
我们称之为没有new
关键字,如下所示,工作已完成
var newPoint = Point(data.x, data.y);
console.log(newPoint.x + ":" + newPoint.y);
当我们创建构造函数时,我们过度,因为对象声明和返回部分在每个函数中都很常见
即,
var obj = {}
return obj
因此new关键字为您提供了声明对象并隐式返回它的样板。
var Point = function (startX, startY) {
var this = {} // implicit declraration by new keyword
this.x = startX;
this.y = startY;
return this //implicit return by new keyword
}
所以你必须将你的变量绑定到你想要返回的变量。