作用域链是用来描述一种路径的术语,沿着该路径可以确定变量的值(或者当函数调用时要使用的方法)。本质上说var关键字决定了哪个函数是特定变量的作用域链的终点(此逻辑也适用于取得变量值的情况)。
当变量作为函数的参数传递时,该变量也会包含在函数的作用域内。
闭包指的是内部函数即使在外部函数执行完成并终止后,仍然可以访问其外部函数的属性。当引用一个变量或方法时,JavaScript会沿着由对象执行路径构成的作用域链对作用域进行解析,查找变量最近定义的值,一旦找到就使用该值。
继承是通过简单地从一个对象原型向另一个对象原型复制方法实现的。
向原型中添加公有方法如果要在实例化新对象时使其包含公有方法,则需要修改构造函数的原型。当修改一个对象原型时,任何继承于该对象的对象和基于该对象的实例都会立即继承同样的变化。
function MyConstructor(name) {
this.name = name;
}
MyConstructor.prototype.alertName = function() {
alert(this.name);
}
var myObject = new MyConstructor();
myObject.alertName();
严格的将,JavaScript中没有私有成员和公有成员的概念;所有对象属性都是公有的,但是有私有变量的概念
私有变量任何在函数中定义的变量,都可以被认为是私有变量(包含函数的参数、局部变量和函数内部定义的函数)。如果要给构造函数添加私有的方法和属性,那么只需要在构造函数中使用var 和 function关键字定义它们。
function MyConstructor(name) {
this.name = name;
var that = this;
function alertName() {
alert(that.name);
}
//实例化时显示
alertName();
}
私有变量在函数的外部不能访问,如果在函数内部创建一个闭包,那么闭包通过自己的作用域链可以访问这些变量。
用于访问私有变量和私有函数的公有方法叫做特权方法(是指构造函数的作用域中使用this关键字定义的方法)。
function MyConstructor(message) {
this.myMessage = message;
//私有属性
var separator = ' -';
var myOwner = this;
//私有方法
function alertMessage() {
alert(myOwner.myMessage);
}
alertMessage();
//特权方法(也是公有)
this.appendToMessage = function (string) {
this.myMessage += separator + string;
alertMessage();
};
}
//公有方法
myConstructor.prototype.clearMessage = function() {
this.myMessage = ' ';
}
//静态属性
myConstructor.name = 'Jason';
//静态方法
myConstructor.alertName = function() {
alert(this.name);
}
var myObject = new MyConstructor('Hello World!');
myObject.appendToMessage('Jason');
界定成员的规则:
1.由于私有和特权成员在函数的内部,因此它们会被带到函数的每个实例中。
2.公有的原型成员是对象蓝图的一部分,适用于通过new关键字实例化的该对象的每个实例。
3.静态成员只适用于对象的一个特殊实例(这个特殊的实例就是作为function对象实例的构造函数本身)
网友评论