JavaSctipt面向对象技术基础....节选笔记

本文节选自JavaScript面对对象基础技术..
http://www.iteye.com/wiki/Object_Oriented_JavaScript

JavaScript下创建对象的三种方式
1:使用Json格式 var bb={name:"xx",....};这种方式方便与数据的传输情况下对象的创建,便于JavaScript里面函数动态调用,如果要再这个
对象里面创建一个新的属性,可以直接使用变量名bb.新属性名="....";来创建一个新的对象属性.
2:使用var bb=new Object();方式创建对象,使用的方式类似第一种方法,同样也可以用于新增属性,
3:基于函数的创建对象,使用起来象java中的javabean一样,先定义个函数
function bb() 然后使用 var cc=new bb()去创建一个对应的对象.

遍历对象所拥有的属性的方式
var name = {"name1":"NAME1","name2":"NAME2","name3":"NAME3","name4":"NAME4"};
var namestring = "";
for(var props in name) { //循环name对象中的属性名字
namestring += name[props];
}
判断对象是否拥有指定的属性,使用alert("key" in name)的方式,第一次看到in关键字

基于函数function的方式去创建一个对象,更准确的说是定义一个对象的类型.
function f(x)...
var f=function(x){....} 分别是基于函数表达式和函数运算符的方式去创建一个对象的类型.
创建一个对象的时候可以创建对象的构造函数,可以要求传入一些参数作为构造函数需要的初始化值
不过那不是必须的,如果没有传入,那么对应的值就为undefined 可以便捷的使用(!key)来判断值是否为undefined

函数中也有对应的arguments属性,用于便捷的访问函数里面的参数,可以使用数组的方式进行访问arguments[0],

再创建对象的时候可以直接使用Josn格式去定义个函数.后面可以使用变量名.函数名进行快捷的调用
var obj = {f0:function(){alert("f0");}}; //对象包含一个方法
function f1() {alert("f1");}
obj.f1 = f1; //为对象添加方法
obj.f0();

每一个函数都有一个prototype属性,如果对对象的prototype进行了属性的附加,那么将会影响到所谓未对该属性进行修改的该对象的实例

JavaScript中所有的函数,也就是function都有一个call和apply方法,用于模拟对象调用方法,它的第一个参数是对象(Object),后面的
参数表示对象调用这个方法时的参数,用例子看的比较清楚
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;
相当于用o增加了一个为f函数的方法,然后调用后面的1 2参数,其中的f为function名
apply不用的地方在于传递参数的方式是以数组的格式Person.apply(o,["name",89]);//Person为函数名,o是new Object 其他为参数

可以方便的使用对象.xx=function(){...}的方式给对象增加一个函数方法

function Circle(radius) {
this.radius = radius;
}
Circle.prototype.area = function() {
return 3.14 * this.radius * this.radius;
}
var c = new Circle(1);
alert(c.area());

可以方便的抽取出公共的方法,然后使用prototype属性添加倒对象的function对象之上,用于节约空间.
其中可以使用this属性访问function对象中的属性.

JavaScript中的继承.
function Circle(radius) { //定义父类Circle
this.radius = radius;
}
Circle.prototype.area = function() { //定义父类的方法area计算面积
return this.radius * this.radius * 3.14;
}

function PositionCircle(x,y,radius) { //定义类PositionCircle
this.x = x; //属性横坐标
this.y = y; //属性纵坐标
Circle.call(this,radius); //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的
//radius属性
}
PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类

var pc = new PositionCircle(1,2,1);
alert(pc.area()); //3.14
//PositionCircle类的area方法继承自Circle类,而Circle类的
//area方法又继承自它的prototype属性对应的prototype对象
alert(pc.radius); //1 PositionCircle类的radius属性继承自Circle类

/*
注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象,
因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属
性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出
的是Circ.
*/
alert(pc.constructor); //Circle

/*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类
的constructor属性
*/
PositionCircle.prototype.constructor = PositionCircle
alert(pc.constructor); //PositionCircle

JavaScript中的作用域和闭包等.

var sco = "global";
function print1() {
alert(sco); //global
}
function print2() {
var sco = "local";
alert(sco); //local
}
function print3() {
alert(sco); //undefined
var sco = "local";
alert(sco); local
}
只要再函数内重新定义一个全局变量同名的变量,那样就是在函数域内部清除对全局变量的引用,不过内部对其他函数的调用不会影响.
不过使用同名的方式,不会是一个好的编程习惯

JavaScript的闭包.就是使用一种定义变量的格式,将变量的域保留在函数内,避免被修改,同时起到了全局变量的作用。
function temp() {
var i = 0;
function b() {
return ++i;
}
return b;
}
var getNext = temp();
alert(getNext()); //1
alert(getNext()); //2
alert(getNext()); //3
alert(getNext()); //4
例子中所用的方法是将操作封装起来,可是依旧可以保留住状态,关键在于return 了一个函数。

同样更为复杂的例子,使用函数内部的函数保存变量的特别引用

function Person(name, age) {
this.getName = function() { return name; };
this.setName = function(newName) { name = newName; };
this.getAge = function() { return age; };
this.setAge = function(newAge) { age = newAge; };
}

var p1 = new Person("sdcyst",3);
alert(p1.getName()); //sdcyst
alert(p1.name); //undefined 因为Person('类')没有name属性
p1.name = "mypara" //显示的给p1添加name属性
alert(p1.getName()); //sdcyst 但是并不会改变getName方法的返回值
alert(p1.name); //mypara 显示出p1对象的name属性
p1.setName("sss"); //改变私有的"name"属性
alert(p1.getName()); //sss
alert(p1.name); //仍旧为mypara

你可能感兴趣的:(JavaScript路上,prototype,JavaScript,编程,F#,json)