向函数,对象和原型添加属性

时间:2016-01-27 09:07:04

标签: javascript function prototype

让我说我有这个功能:

function myFunc () {
    this.property1 = 10;
}
var myObject = new myFunc();

现在我想说我想为它添加一个新属性。

myFunc.newProperty = "New"; 
myObject.newProperty = "New";
myFunc.prototype.newProperty = "New";

这些方法有什么区别?我应该使用哪一个?

3 个答案:

答案 0 :(得分:3)

方法1

myFunc.newProperty = "New"; 

因为function本身是一个对象,所以只需在其上创建一个新属性即可。如果您直接使用功能对象

,这可能会很有用

方法2

myObject.newProperty = "New";

myFunc构造函数的新实例上,创建自己的属性。当您需要修改单个实例但不想使用newProperty修改类本身时很有用。
使用new myFunc()创建的任何新实例都不会继承或包含newProperty

方法3

myFunc.prototype.newProperty = "New";

如果修改构造函数原型,则创建的对象将继承此属性。当您需要使用new myFunc()创建的任何现有对象或新对象继承newProperty时非常有用。

使用哪一个取决于任务。通常使用 2 3 点。

答案 1 :(得分:1)

myFunct是构造函数(实际上JS中的每个函数都可以用作构造函数),当与new一起使用时,此函数会创建一个新对象。

现在您想要向对象添加新属性:

1)想要为已创建的myObject添加新属性

myObject.newProperty = "New";

2)想要为从myFunc

创建的每个对象添加新属性
function myFunc () {
    this.property1 = 10;
    this.newProperty = "New"; 
}

3)希望在已经从myFunc创建的所有对象中拥有新属性,并且它应该是来自{{1的所有新创建的对象的父对象的属性(因此只有一个副本可用) }}

myFunc

答案 2 :(得分:1)

所以当你做的时候

A = cellfun(@transpose,Arad,'UniformOutput',false); %transpose the cell array
maxSize = max(cellfun(@numel,A)); %# Get the maximum vector size 
fcn = @(x) [x nan(1,maxSize-numel(x))]; %# Create an anonymous function rmat = cellfun(fcn,A,'UniformOutput',false); %# Pad each cell with NaNs 
rmat = horzcat(rmat{:}) ; % concatenate horizontally 
rmat = horzcat(rmat{:}) ; % concatenate horizontally again 
rmat = reshape(rmat,maxSize, []);% reshape to m(=maxsize)x n(determined by total number of elements/number of rows(maxsize)

此属性被视为myFunc的私有属性,因此即使您创建了myFunc的某个实例,也无法访问。

的情况相同
myFunc.newProperty = "New"; 

当你将它作为myObject的私有属性处理时,所以在myObject之外你无法访问它。

当你做的时候

myObject.newProperty = "New";

您可以从myFunc的所有实例访问newProperty。

哪个好,哪个坏,我不能说它的所有要求