[英]method for object's property in Javascript
I have a constructor: 我有一个构造函数:
function Point(point, left, right) {
this.p = point;
this.l = left;
this.r = right
}
var bezierPoint = new Point([0.0,0.0],[-50.43794, 0.0],[25.54714,4.78643])
Is there a proper way to make a method that I could use among all the properties and not with the object itself? 是否有适当的方法可以使我可以在所有属性中使用方法,而不能与对象本身一起使用? For example if I want to output 例如,如果我想输出
console.log(bezierPoint.l) // -50.43794, 0.0
console.log(bezierPoint.l.round()) // -50, 0
console.log(bezierPoint.r.round()) // 26, 5
Or is this the wrong approach and I should make new methods for the types of data I'll be working with? 还是这是错误的方法,我应该针对将要使用的数据类型制定新的方法? Something like 就像是
Array.prototype.round = function() {
return [Math.round(this[0]), Math.round(this[1])] //this code doesn't matter now
}
console.log(bezierPoint.l.round()) // -50, 0
You can use the parameters as inner variables and expose the methods as follows: 您可以将参数用作内部变量,并公开以下方法:
function Point(point, left, right) {
function exposed(points) {
return {
value: function () {
return points;
},
round: function () {
return [Math.round(points[0]), Math.round(points[1])];
}
};
}
this.p = exposed(point);
this.l = exposed(left);
this.r = exposed(right);
}
Then you can use it like: 然后您可以像这样使用它:
var bezierPoint = new Point([0.0, 0.0], [-50.43794, 0.0], [25.54714, 4.78643]);
document.write('value:' + bezierPoint.l.value() + '<br />'); // value:-50.43794,0
document.write('round:' + bezierPoint.l.round() + '<br />'); // round:-50,0
Yet another approach. 还有另一种方法。 A bit more code, but more prototypical and solid. 更多的代码,但更典型 ,更可靠。
// Common point class
/**
* Creates simple point class
* Point can be passed as two separate coordinates or as an array (coordinates pair). In case of array, second argument is omitted.
* @param {String|Number|Array} a
* @param {String|Number|undefined} b
* @returns {Point}
*/
var Point = function (a, b) {
if (!!a && !!b) {
this.a = parseFloat(a);
this.b = parseFloat(b);
} else if (a.constructor === Array ? a.length === 2 : false) {
this.a = parseFloat(a[0]);
this.b = parseFloat(a[1]);
} else {
throw 'Wrong data provided for `Point`';
}
}
/**
* @returns {Array} Rounded coordinates pair
*/
Point.prototype.round = function () {
return [Math.round(this.a), Math.round(this.b)];
}
/**
* @returns {Array} Raw coordinates pair (as they were passed to constructor)
*/
Point.prototype.value = function () {
return [this.a, this.b];
}
// Bezier point class
/**
* Creates a Bezier point instance
* @param {Array|Point} point
* @param {Array|Point} left
* @param {Array|Point} right
* @returns {BezierPoint}
*/
var BezierPoint = function (point, left, right) {
this.p = point instanceof Point ? point : new Point(point);
this.l = left instanceof Point ? left : new Point(left);
this.r = right instanceof Point ? right : new Point(right);
}
// Operation
var bezierPoint = new BezierPoint([0.0,0.0], [-50.43794, 0.0], [25.54714,4.78643]);
Each point can be passed to BezierPoint
as an array or already well-formed Point
class. 可以将每个点作为数组或格式良好的Point
类传递给BezierPoint
。
UPD: As an extension for existing answer ability to define arbitrary number of points can be provided next way. UPD:作为现有答案功能的扩展,可以通过以下方式定义任意数量的点。
var ArbitraryNumberOfPoints = function (args) {
this.points = args.length === 0 ? [] :
args.map(function (arg) {
return arg instanceof Point ? arg : new Point(arg);
});
}
ArbitraryNumberOfPoints.prototype.round = function () {
return this.points.map(function (pointInstance) {
return pointInstance.round();
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.