面向对象知识笔记(一)

//1.生成实例对象的原始模式
// var Cat = {
// name:'',
// color:''
// }
//根据这个原型对象的规格,生成两个实例对象
/*
var cat1 = {}; //创建一个空对象
cat1.name = "小花猫"; //按照原型对象的属性赋值
cat1.color = "花色";

var cat2 = {};
cat2.name = "二毛";
cat2.color = "黑色";
*/

/*
这就是最简单的封装了,把两个属性封装在一个对象里面,但是,这样的写法有两个缺点,
一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系


//2.原始模式的改进 我们可以写一个函数,解决代码重复的问题
function Cat(name, color) {
return {
name: name,
color: color
}
}

//然后生成实例对象,就等于是在调用函数:
var cat1 = Cat('大花猫', 'red');
var cat2 = Cat('三毛', '蓝色');
*/
/*

//这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出他们是同一个原型对象的实例.
//3.构造函数模式

//为了解决从原型对象那个生成实例的问题,JavaScript提供了一个构造函数(construceotr)模式, 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上,比如猫的原型对象
function Cat(name, color) {
this.name = name;
this.color = color;
}
var cat1 = new Cat("大毛", "黄色");
var cat2 = new Cat("二毛", "黑色");

// alert(cat1.name);//大毛
// alert(cat2.name);//黄色
//此时,cat1和cat2就自动含有一个constructor属性,指向他们的构造函数
alert(cat1.constructor == Cat);
alert(cat2.constructor == Cat);
//javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系 此处(cat1于cat2就是实例 Cat是原型)
alert(cat1 instanceof Cat); //true 检测cat1是否是Cat的实例
alert(cat2 instanceof Cat); //true 检测cat1是否是Cat的实例
*/
/*
4.构造函数模式的问题 构造函数方法虽然很好用,但是存在一个浪费内存的问题
我们现在为Cat对象添加一个不变的属性type(种类),在添加一个方法eat(吃),那么,原型对象Cat就变成下面这样


function Cat(name,color){
this.nam = name;
this.color = color;
this.type = "猫科动物";
this.eat = function(){
alert('吃老鼠');
}
}
//生成实例
var cat1 = new Cat('小喵喵','白色');
var cat2 = new Cat('小黑猫','白色');
cat1.eat(); //吃老鼠
//表面看这样没什么问题,但是实际上这样做,有一个很大弊端,那就是对于每一个实例,type属性和eat()方法都是一样的,每次生成的实例,都必须是重复的内容,多占用一些内存
alert(cat1.eat == cat2.eat); //false
*/
/*5.javascript规定

每一个构造函数都有一个protoytpe属性,指向另一个对象,这个对象的所有属性和方法,都会被构造函数的实例继承。 也就是说可以把那些不变的属性和方法,直接定义在prototype对象上
function Cat(name,color){
this.name = name;
this.coloe = color;
}
Cat.prototype.type = "猫科动物";
Cat.prototype.eat = function(){
alert('猫吃老鼠');
}
//生成实例

var cat1 = new Cat('大毛','绿色');
var cat2 = new Cat('四毛','蓝色');

alert(cat1.type); //猫科动物
cat1.eat();//吃老鼠
//这时所有实例的type属性和eat()方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率
alert(cat1.eat == cat2.eat) //true

*/
/* 6.prototype模式验证方法
6.1 isPrototypeOf()

用来判断某个prototype对象和某个实例之间的关系 也就是说谁的原型链中是否包含了xx的原型

6.2 hasOwnProperty()

每个实例对象都有一个hasOwnproperty()方法。用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性
function Cat(name,color){
this.name = name;
this.coloe = color;
}
Cat.prototype.type = "猫科动物";
Cat.prototype.eat = function(){
alert('猫吃老鼠');
}
//生成实例

var cat1 = new Cat('大毛','绿色');
var cat2 = new Cat('四毛','蓝色');
alert(cat1.hasOwnProperty("name")); //true
alert(Cat.hasOwnProperty("type"));//false 继承自prototype对象的属性


6.3 in运算符

可以用来判断,某个实例是否含有某个属性,不管是不是本地属性

function Cat(name,color){
this.name = name;
this.coloe = color;
}
Cat.prototype.type = "猫科动物";
Cat.prototype.eat = function(){
alert('猫吃老鼠');
}
//生成实例

var cat1 = new Cat('大毛','绿色');
var cat2 = new Cat('四毛','蓝色');
alert("name" in cat1); //true
alert("type" in cat1);//true
in 运算符还可以用来遍历某个对象的所有属性。
for(var prop in cat1){
alert("cat1["+prop+"]="+cat1[prop]); //弹出这个对象的所有属性
}

*/

posted @ 2018-06-29 14:55  菜鸟程序员的总结  阅读(141)  评论(0编辑  收藏  举报