代码如下:
function echo(){
for(let i=0;i<arguments.length;i++)
console.log(arguments[i]);
}
function extend(o, p){
for (prop in p) {
o[prop] = p[prop]
}
return o;
}
function People(name,age){
//在产生第一个实例的时候初始化类变量,同时重新指定了__proto__,使得拥有了一个count属性,好处是修改不扩散到Function.prototype,坏处是原型发生了变化,可能失去继承关系,在多层继承的时候不可用。
if(People.count===undefined){
_count=0;
People.__proto__={
get count(){return a()},
set count(n){_count=n}}
}
//使得局部变量成为自由变量,实现记忆功能
function a(){return _count}
//下面语句实现父类属性向子类的传播
extend(People.prototype, People.__proto__)
//下面语句实现子类和父类的静态变量的 双向绑定
Object.defineProperty(this,'count',
{
get: function(){return a()},
set: function(n){_count=n}
})
echo("新建第"+_count+"实例")
_count++
}
a=new People("a",1)
b=new People("a",1)
echo(People.count)
c=new People("a",1)
echo(a.count)
a.count=8
echo("修改实例的count为8")
echo("类的counts属性变为")
echo(People.count)
echo("修改类的count为10")
echo("实例的counts属性变为")
People.count=10
echo(a.count)
d=new People("a",1)
echo(a.count)
//People.count=1