如果我有一个虚拟构造函数对象:
function Circle()
{
this.radius = 3;
}
此对象的实例将具有单个“radius”属性。 a)如何查询构造函数对象的属性数量?
b)我如何查询Circle.prototype
它拥有的属性数量?尝试console.log(Object.getOwnPropertyNames(Circle.prototype))
之类的东西不会返回任何内容
答案 0 :(得分:1)
var cir = new Circle();
var j = 0;
for(var i in cir) {
if (cir.hasOwnProperty(i)) {
j++;
}
}
j == 1; // true
答案 1 :(得分:1)
你有几个术语错误。
prototype
,所以如果您要迭代对象的原型,则不会看到radius
属性。假设你真正要说的是:“我如何迭代我的Circle对象实例的属性?”,答案是这样的:
function Circle()
{
this.radius = 3;
this.border = 1;
this.color = "red";
}
var obj = new Circle();
for (var i in obj) {
// hasOwnProperty makes sure we get properties only of Circle,
// not of ancestors like Object
if (obj.hasOwnProperty(i)) {
// i will be properties of obj on each iteration
console.log(i); // radius, border, color
}
}
对象的原型是另一回事。您可以将其视为对象的每个新实例自动继承的结构。您可以像这样使用原型:
function Circle(r)
{
this.radius = r;
this.border = 1;
this.color = "red";
}
Circle.prototype.calcArea = function() {
return(Math.PI * this.radius * this.radius);
}
Circle.prototype.calcCircumference = function() {
return(Math.PI * this.radius * 2);
}
这将自动给出Circle的每个实例,两个方法calcArea和calcCircumference。
var cir = new Circle(4);
console.log(cir.calcArea()); // 54.624
您还可以将方法添加到您没有代码的预先存在的对象的原型中(例如,在执行此操作时必须小心)。例如:
Array.prototype.isSorted = function() {
for (var i = 1; i < this.length; i++) {
if (this[i] < this[i-1]) {
return(false);
}
}
return(true);
}
var x = [1,3,6,8];
var y = [1,3,8,6];
console.log(x.isSorted()); // true
console.log(y.isSorted()); // false