1、面向对象编程
面向对象编程Object Oriented Programmimg
:把具备相同特征的事务抽象出一个类,把描述这个类的属性和方法挂在这个类的原型(prototype)上,这种方式叫作面向对象编程
对象:万物皆对象 对象封装了一些属性和方法用来描述一个事物或者供咱们调用
类:对象的具体细分(按照功能特色进行分类:大类、小类)
内置类:Object / Array / Date / RegExp / Function
实例:类中具体的一个事物(拿出类别中的具体一个实例进行研究,那么当前类别下的其余实例也具有这些特色和特征)
2、原型{prototype
):
1.全部的函数数据类型都有一个prototype
的属性,它的属性值是一个对象,浏览器会为他开辟一个堆内存
2.在浏览器给prototype开辟的堆内存中有一个自带的属性:constructor
,这个属性存储的是当前函数自己
3.全部的对象都有一个__proto__的属性,这个属性指向当前所属类的prototype(若是不能肯定它是谁的实例,就是基类Object的实例)
3、原型链(__proto__
):
它是一种基于__proto__
的向上查找机制。当咱们操做实例上的某个属性或者方法的时候,首先会在本身空间中查找私有属性或方法
找到则查找结束,用私有属性便可;若是没查到,则基于__proto__
找所属类(即构造函数)的prototype,若是有则用此公有属性,若是没有,继续基于原型上的__proto__
向上查找,一直找到基类Object的prototype为止
若是Object.prototype
上没有此属性,则此属性或方法不存在
只要是函数,无论是什么类,永远都是内置Function类的实例
构造函数的原型下的方法只给它的实例化对象使用
原型链执行题:
题目一:
function Fn (name, age ) {
let n = '哈哈' ;
this .name = name;
this .age = age;
this .AA = function ( ) {
console .log(1 )
}
};
Fn.prototype.m = function ( ) {
console .log(2 );
};
Fn.prototype.AA = function ( ) {
console .log(3 );
}
Object .prototype.m = function ( ) {
console .log(4 );
};
Function .prototype.m = function ( ) {
console .log(5 )
}
let f1 = new Fn('Tom' ,'18' );
let f2 = new Fn('Jerry' ,'18' );
console .log(Fn.prototype.m());
console .log(new Fn().m());
console .log(f1.m());
console .log(f1.m() === Fn.prototype.m());
console .log(typeof Fn.prototype);
console .log(f1 === f2);
console .log(f1.__proto__.AA === f2.__proto__.AA);
console .log(f1.__proto__.AA === Fn.prototype.AA);
console .log(f1.hasOwnProperty === Fn.prototype.hasOwnProperty);
f1.BB = '123' ;
f1.__proto__.CC = '456' ;
console .log(f1.BB);
console .log(f1.CC);
复制代码
题目二:
function Fn ( ) {
var n = 10 ;
this .name = '珠峰' ;
this .age = 12 ;
console .log(this );
};
Function .prototype.n = function ( ) {
console .log(123 );
};
var fn = new Fn();
console .log(fn);
console .dir(Fn);
console .log(fn.n);
console .log(Fn.n);
console .log(Fn.n());
console .log(fn.name);
console .log(fn.age);
console .log(fn.constructor);
console .log(fn.__proto__);
console .log(Fn.prototype);
console .log(fn instanceof Fn);
console .log(fn instanceof Object );
console .log(fn instanceof Function );
console .log('n' in fn);
console .log('n' in Fn);
console .log('name' in fn);
console .log('name' in Fn);
console .log('age' in Fn);
console .log('constructor' in Fn);
console .log('toString' in Fn);
console .log(fn.hasOwnProperty('name' ));
console .log(fn.hasOwnProperty('age' ));
console .log(fn.hasOwnProperty('n' ));
console .log(fn.hasOwnProperty('toString' ));
function hasPubProperty (attr,obj ) {
return (attr in obj) && (obj.hasOwnProperty(attr) === false )
};
console .log(hasPubProperty('toString' ,fn));
复制代码
题目三:
function Foo (name, age ) {
this .name = name;
this .printName = function ( ) {
console .log('haha' , this .name);
}
}
Foo.prototype.alertName = function ( ) {
alert(this .name)
}
Foo.prototype.printName = function ( ) {
console .log('hihi' , this .name);
}
var f = new Foo('zhangsan' );
f.printName = function ( ) {
console .log('hehe' , this .name);
}
f.printName();
f.alertName();
复制代码
题目四:
var fullname = 'John Doe' ;
var obj = {
fullname : 'Colin Ihrig' ,
prop : {
fullname : 'Aurelio De Rosa' ,
getFullname : function ( ) {
return this .fullname;
}
}
};
console .log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console .log(test());
复制代码
题目五:
function Person (name ) {
this .name = name;
}
Person.prototype.share = [];
Person.prototype.printName = function ( ) {
alert(this .name);
}
var person1 = new Person('Byron' );
var person2 = new Person('Frank' );
person1.share.push(1 );
person2.share.push(2 );
console .log(person2.share);
复制代码
题目六:
function foo ( ) {
this .add = function (x, y ) {
return x + y;
}
}
foo.prototype.add = function (x, y ) {
return x + y + 10 ;
}
Object .prototype.minus = function (x, y ) {
return x - y;
}
var f = new foo();
console .log(f.add(1 , 2 ));
console .log(f.minus(1 , 2 ));
复制代码
题目七:
function A ( ) {
}
function B (a ) {
this .a = a;
}
function C (a ) {
if (a) {
this .a = a;
}
}
A.prototype.a = 1 ;
B.prototype.a = 1 ;
C.prototype.a = 1 ;
console .log(new A().a);
console .log(new B().a);
console .log(new C(2 ).a);
复制代码
题目八:
function Fn ( ) {
this .x = 100 ;
this .y = 200 ;
this .getX = function ( ) {
console .log(this .x);
}
}
Fn.prototype.getX = function ( ) {
console .log(this .x);
};
Fn.prototype.getY = function ( ) {
console .log(this .y);
};
var f1 = new Fn;
var f2 = new Fn;
console .log(f1.getX === f2.getX);
console .log(f1.getY === f2.getY);
console .log(f1.__proto__.getY === Fn.prototype.getY);
console .log(f1.__proto__.getX === f2.getX);
console .log(f1.__proto__.getX === Fn.prototype.getX);
console .log(f1.constructor);
console .log(Fn.prototype.__proto__.constructor);
f1.getX();
f1.__proto__.getX();
f2.getY();
Fn.prototype.getY();
复制代码
题目九:
function Fn (name ) {
this .name = name;
let name = 20 ;
}
Fn.prototype.say = function ( ) {
console .log(5 );
}
Function .prototype.say = function ( ) {
alert(8 );
}
Function .say = function ( ) {
alert(9 );
}
Function .__proto__.say = function ( ) {
alert(10 );
}
let oo = new Fn;
oo.__proto__.say = function ( ) {
console .log(6 );
}
oo.__proto__.__proto__.say = function ( ) {
console .log(7 );
}
oo.say();
复制代码
题目十:
function fn ( ) {
return function ( ) {
console .log(3 );
}
}
fn.prototype.say = function ( ) {
console .log(2 );
}
Function .prototype.say = function ( ) {
console .log(4 );
}
fn.say = function ( ) {
console .log(1 );
};
new fn().say();
new fn.say();
复制代码