根据书《javascript DOM高级程序设计》一书整理的笔记
var Myconstuctor = function(name){
//特权成员
与私有方法不同,特权方法能够被公开访问,而且还能够访问私有成员。特权方法是指在构造函数的作用域中使用this关键字定义的方法。
以这种方式创建特权方法后, Myconstuctor同样拥有了prototype相同的方法,但此时的方法位于构造函数的作用域中,因而具有通过作用域链访问私有的成员的权限。
this.myname =name
this.appendMyname = function(string){
this.myname = string;
}
//私有成员
私有成员:私有成员就是在另一个函数中定义的变量和函数。如果要给前面的Myconstuctor添加一个私有的方法和属性,只需要使用构造函数中使用的普通的var和function关键字定义它们即可。这个例子代码中也包含另一个私有属性myOwner,它引用的是this。通过this赋值给myOwner,你的私有方法就可以通过引用myOwner来访问Myconstuctor的实例。私有方法是存在于构造函数作用域中的自包含的(self-contained)对象,它们实际上并不是prototype的方法,因此在私有方法内部this引用的只是私有方法的实例,而非Myconstuctor的实例。而在作用域链中,私有成员内部的myOwner将会解析为上层的Myconstuctor的实例。
同样也不能在对象外部访问这些私有成员,因为它们被限制在了构造函数的作用域中。如果试图在实例中访问它们,无论是调用 实例.alertname()还是 实例.myname 都将失败。而且由于这些私有成员被严格限制在构造函数的作用域中,所以也不能通过对象自己的公有方法来访问它们。因为私有的属性只存在于对象的构造函数之中。而要避开这个限制,就需要用到特权成员了。
var myname = "wang";
var myOwner = this;
function alertname(){
alert(myOwner.name) ;
}
}
//静态成员
静态成员:创建静态成员后Myconstuctor既是一个实例(Function的实例),也是一个构造函数。但静态成员不会应用到Myconstuctor的任何新实例中。如果新建Myconstuctor实例,偿试访问它的静态成员,将会报错。 (理解实例与构造函数将消除许多问题)
Myconstuctor.age ="27"
Myconstuctor.alertname(){
alert("静态成员")
}
//公有方法
公有方法:如果想在实例化新对象时包含其公有方法,则需要修改对象的原型(prototype)属性。prototype属性是用来定义对象自身内部结构的一个特殊成员。它与其它传统的面向对象语言中的类相似,但又不同于类。如果你不熟悉面向对象的编程语方和(或)原型架构,那么你可以把对象的原型想像为对象的蓝图,而这个蓝图一旦被修改,则会立即改变基于它派生的对象和实例。
当修改一个对象的原型时,任何继承该对象的对象和该对象已经存在的所有实例都会立即继承同样的变化。根据用法不同,这一特性既强大也可能导致问题,因为当你修改已有的但不是你的对象的原型时一定要谨慎从事。
但是,你不能直接在Myconstuctor上面调用这个方法,因为Myconstuctor是Function对象的实例,而不是Myconstuctor对象的实例。
Myconstuctor.prototype.clearname = function(){
this.myname = "";
}
由于私有和特权成员在函数的内部,因此它们会被带到函数的每个实例中。
公有的原型成员是对象蓝图的一部分,适用于通过new关键字实例化的该对象的每个实例。
静态成员只适用于对象的一个特殊实例。
补充:
function Man(name, age) {
//定义实例属性
this.name = name;
this.age = age;
}
//定义静态属性。^v^
Man.sex = '男';
//定义原型属性
Man.prototype.phone = '123456';
//除了name.sex和Man.prototype.phone其余全部是Undefined
alert(Man.sex + "-----" + Man.prototype.phone + "--" + Man.name + "--" + Man.age + "--" + Man.phone);
var man = new Man("Tom", 24);
alert(Man.sex + "--" + man.name + "--" + man.age + "--" + man.phone);
/**
* 通过例子说明:原型属性在实例化之后作为类的实例属性。
* 但是实例属性在实例化之后却不能作为原型属性。
*/