一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

javascript面向对象学习之一

时间:2014-03-26 编辑:简简单单 来源:一聚教程网

复习面向对象知识:

什么是包装对象?

基本类型都有自己对应的包装对象 String Number Boolean Array Data

字符串不是对象为什么会有方法呢?

解:方法都挂在包装对象的原型下面 var str=new String();

原型链

//原型链的最外层:Object.prototype

实例对象与原型之间的连接,叫做原型链 _proto_

function Aaa(){
this.num=20; //优先级高于原型下的num
}
Aaa.prototype.num=10;(通过原型链找到的Num)

Object.prototype.num=30;(最外层的,优先级最低)

var p1=new Aaa();

alert(p1.num); // 20;

—————————————————–

高级面向对象

面象对象的一些属性和方法

hasOwnProperty :看是不是对象自身下面的属性
var arr=[];
arr.num=10;
Array.prototype.num2=20;
alert(arr.hasOwnProperty(‘num’));//true;
alert(arr.hasOwnproperty(‘num2′)); // false;

constructor :查看对象的构造函数(可以用来判断是不是数组,及其它类型)
function Aaa(){}
var a1=new Aaa();
alert(a1.constructor);// Aaa这个构造函数 ( Aaa.prototype.constructor=Aaa; 程序自动生成这句话

判断是不是Array数组(在iframe情况下失效)
alert(arr.constructor==Array){ }

避免修改constructor 如下;
function Aaa(){}

1,第一种方法 www.111com.net
Aaa.prototype.name=”小明”; //向原型下添加方法不会修改constructor
2,第二种方法
Aaa.prototype={ //这里会覆盖constructor
constructor : Aaa, //这里需要指定下construtor(比较大的库都会指定下,如jquery
name :”小明”
}

For in 找不到系统自带的属性

instanceof :对象与构造函数在原型上是否有关系(也可以用来判断数组 )

var arr=[];
alert( arr instanceof Array ); //true;可以用来判断是不是数组

function Aaa (){}
var a1=new Aaa();
alert(a1 instanceof Aaa ) // true;
alert(a1 instanceof Object ) // true;

toString(); 作用:把对象转成字符串;(系统对象下面都是自带的,自己写的对象都是通过原型链找Object下面的)

var num=255; alert(num.toString(16));//接收一个参数,转进制;(颜色rgba转换)

利用toString做类型的判断:
var arr=[];
alert( Object.prototype.toString.call(arr) );//[object Array]

判断一个变量是不是数组array的三种方法:
alert( Object.prototype.toString.call(arr)== ‘[object Array]‘ ); 最好的数组判断方法,推荐
alert(arr.constructor==Array)(在iframe情况下失效)
alert( arr instanceof Array ); (在iframe情况下失效)

封装
 
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。
那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢?
一、 生成对象的原始模式 www.111com.net
假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性。
var Cat = {
name : '',
color : ''
}
现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象。
var cat1 = {}; // 创建一个空对象
cat1.name = "大毛"; // 按照原型对象的属性赋值
cat1.color = "黄色";
var cat2 = {};
cat2.name = "二毛";
cat2.color = "黑色";
好了,这就是最简单的封装了,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系。
二、 原始模式的改进
我们可以写一个函数,解决代码重复的问题。
function Cat(name,color){
return {
name:name,
color:color
}
}
然后生成实例对象,就等于是在调用函数:
var cat1 = Cat("大毛","黄色");
var cat2 = Cat("二毛","黑色");
这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出它们是同一个原型对象的实例

热门栏目