标签:
面向对象的编程语言中有一个非常重要的参数,那就是类的概念,通过类我们可以创建出来各种各样的对象,而ECMAscript中没有类的概念,所以他与别的编程语言中处理对象的方式有所不同。
ECMA-262中规定了对象:无数属性的集合,其属性可以包含基本值,对象或其他函数属性是与对象相关的值。
方法是能够在对象执行的动作。
案例一:
var people=new Object();
people.name="zhangsan";
people.sex=18;
people.say=function(){
alert(people.name+" "+people.sex)
}
people.say();
我们还可以这么写:
var people={
name:"zhangsan",
age:18,
say:function(){
alert(this.name)
}
}
people.say();
delete people.name——注意点1:我们可以使用delete删除对象的某一个属性。 举例生活中的对象
function people(name,age){
this.name=name;
this.age=age;
this.changeName=function(newName){
this.name=newName;
}
}
var zhangsan=new people("zhangsan",18);
zhangsan.changeName("lisi");
alert(zhangsan.name+" "+zhangsan.age)
---在类中通过this关键字添加的属性输入共有
工厂模式抽象了创建具体对象的过程,考虑到ECMA无法创建类开发人员声明了一种函数,用函数封装了创建对象的细节。
function createPeople(name,age,sex){
var o=new Object();
o.name=name;
o.sex=sex;
o.age=age;
//
o.say=function(){
alert(this.name)
}
return o;
}
var zhangsan=createPeople("zhangsan",18,‘male‘);
alert(zhangsan.name)
构造函数——用于构造一个对象出来的函数
例如Object 和数组等等
function People(name,age,sex){
this.name=name;
this,age=age;
this.sex=sex;
this.say=function(){
alert(this.name)
}
}
var zhangsan=new People("zhangsan",18,‘male‘)
zhangsan.say();
在这个例子中和工厂模型的区别,直接将属性和方法赋值给了this对象,没有了return语句。
语法注意,构造函数开头字母不许大写,注意每个通过构造函数创建出来的对象都有一个constructor属性
构造函数也是函数,也可以当做参数传递。
http://uule.iteye.com/blog/1158829
语法:xxx.call([thisObj[,arg2[,argN]]]) 定义:调用一个对象的call方法,以另一个对象替换当前对象 说明:call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变成由thisObj指定的新对象。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
得到的结果为4
案例:人 学生 老师 对象继承 方法覆盖
function People(name,age){
this.name=name;
this.age=age;
this.say=function(){
alert(this.name+" "+this.age);
}
}
function Student(sName,sAge){
//调用一个对象的call方法,以另一个对象替换当前对象。
People.call(this,sName,sAge);//发生了继承----伪装继承
}
var zhangsan=new Student("zhangsan",18);
zhangsan.say();
function Teacher(name,age){
People.call(this,name,age);
}
var laowang=new Teacher("laowang",43);
laowang.say();
语法:apply([thisObj[,argArray]]) 定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明: 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
//通过call或apply方法,将原本属于Animal对象
的showName()方法交给对象cat来使用了。
//输入结果为"Cat"
//animal.showName.call(cat,",");
animal.showName.apply(cat,[]);
实现继承
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.call(this, name);
}
var cat = new Cat("Black Cat");
cat.showName();
构造函数的问题: 关键在方法上:
function People(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.say=new Function("alert(this.name)")
}
var zhangsan=new People("zhangsan",18,"male");
zhangsan.say();
var zhangsan=new People("zhangsan",18,"male");
var lisi=new People("lisi",18,"male");
alert(zhangsan.say===lisi.say)---false
这是为什么呢? 因为每次都new新的方法导致了这个问题 解决方案:
function People(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.say=say;
}
function say(){
alert(this.name)
}
var zhangsan=new People("zhangsan",18,"male");
var lisi=new People("lisi",18,"male");
alert(zhangsan.say===lisi.say)
这个还可以优化代码。
新手新人 如果不对之处请指正~!
标签:
原文地址:http://www.cnblogs.com/yidian2ma/p/4749035.html