发表于: 2017-02-27 22:50:07
1 1224
一、今天完成的事情:
1.修改了今天demo中出现的bug;
2.看了高程,加深了对构造函数和闭包的认识;
二、明天要做的事情:
1.继续补基础;
2.再次demo;
三、遇到的问题:
1.用匿名函数来模仿块级作用域,避免前面使用了变量,后面声明变量之后变量还是会不变,
2.变量只不过是值的另一种表现形式,所以用实际的值来替换变量并没有问题。
3.将函数声明直接转换为表达式,可以用这个方法来让它拥有块级作用域,在这个函数中的所有变量都会在它完成的时候被全部销毁,这个原理是因为没有指向匿名函数的引用,所以在函数执行完毕的时候就会自动销毁作用域链了。
4.私有变量:只有函数内部可以访问到的变量称为私有变量
5.特权方法:有权访问私有变量和私有函数的公有方法称为特权方法,有两种方法来创建特权方法:第一种,在构造函数中定义特权方法:
function myObject() {
var value = 100;
function privateFn() {
return false;
};
this.publicMethod = function () {
value++;
return privateFn()
}
}
var value = 100;
function privateFn() {
return false;
};
this.publicMethod = function () {
value++;
return privateFn()
}
}
在上面这个例子中,value和privatefn都值能通过里面的pulicmethod来进行访问,除此之外没有任何方法来访问它们。我们利用这个方法可以来隐藏那些不应该被修改的数据。
'use strict';
function Person(name) {
this.setName = function (value) {
name = value;
}
this.getName = function () {
console.log(name)
return name
}
}
var nike = new Person('nike');
nike.getName();
nike.setName('Frank');
nike.getName();
function Person(name) {
this.setName = function (value) {
name = value;
}
this.getName = function () {
console.log(name)
return name
}
}
var nike = new Person('nike');
nike.getName();
nike.setName('Frank');
nike.getName();
在这个例子中,我们可以想象成在此函数我们先var name = name 前面的name是这个函数的私有变量,后面是我们传入的值,setname会改变name,getname会将这个name值传出
在Person构造函数中,getName和setName是它的特权方法,我们上面提到的想象出的name变量是它的私有变量,但是我们使用构造函数来建立特权方法有一个弊端——每个实例都会创建同样的一组新方法。我们使用静态私有变量的特权方法即可解决这个问题:
(function () {
var name = '';
Myobject = function (value) {
name = value
};
Myobject.prototype.getNmae = function () {
return name;
};
Myobject.prototype.setName = function (value) {
name = value;
}
})()
var person1 = new Myobject('Frank');
console.log(person1.getNmae());
person1.setName('nike');
console.log(person1.getNmae());
var person2 = new Myobject('Lina');
console.log(person2.getNmae());
var name = '';
Myobject = function (value) {
name = value
};
Myobject.prototype.getNmae = function () {
return name;
};
Myobject.prototype.setName = function (value) {
name = value;
}
})()
var person1 = new Myobject('Frank');
console.log(person1.getNmae());
person1.setName('nike');
console.log(person1.getNmae());
var person2 = new Myobject('Lina');
console.log(person2.getNmae());
代码如上所述,我们先创建了一个私有作用域(块级作用域),在这个作用域中,有一个私有静态变量name,特别注意我在下面声明了一个Myobject构造函数,然后再这个构造函数的原型链中写了两个方法。其他都跟我们上一个例子一样,这又引出了我的思考,this和prototype来做的区别到底是什么,
评论