<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>原型</title>
</head>
<body>
<!--
1.函数的prototype属性
- 每个函数都有一个prototype属性,且默认指向一个空的Object对象(即称为:原型对象)
- 原型对象中有一个属性constructor,它指向函数对象
2.给原型对象添加属性(一般都是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法)
-->
<script>
// 输出Date原型中的属性及方法以及Date原型的类型
console.log(Date.prototype, typeof Date.prototype)
// 定义一个函数Fn
function Fn(){}
// 输出Fn原型中的属性及方法以及Fn原型的类型
console.log(Fn.prototype, typeof Fn.prototype)
// 查看原型中对象的constructor属性是否指向原对象
console.log(Date.prototype.constructor === Date)
console.log(Fn.prototype.constructor === Fn)
// 给原型对象添加属性
Fn.prototype.test = function(){
console.log("test....")
}
// 声明一个实例对象
var f1 = new Fn();
// 调用原型中的方法
f1.test()
</script>
</body>
</html>
console.log(Date.prototype, typeof Date.prototype)
function fn(){}
console.log(fn.prototype, typeof fn.prototype)
自定义fn函数,输出fn函数的原型,默认为空对象(并没有多余的属性和方法),原型类型为Object
console.log(Date.prototype.constructor === Date) // true
console.log(fn.prototype.constructor === fn) // true
定义一个Type函数 function Type(){ }
其内部有prototype属性,此属性指向一个对象,对象中有constructor属性,指向原来的Type函数
function Fn(){}
// 给原型对象添加属性(一般是方法) 可供实例对象使用
Fn.prototype.test = function(){
console.log("test....")
}
// 声明一个实例对象
var f1 = new Fn();
// 调用原型中的方法
f1.test()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>显式原型与隐式原型</title>
</head>
<body>
<!--
1.每个函数function都有一个prototype属性,即显式原型属性
2.每个实例对象都有一个__proto__,可称为隐式原型属性
3.对象的隐式原型的值为其对应构造函数的显式原型的值
4.内存结构
5.总结
- 函数的prototype属性:在定义函数时自动添加的,默认值时一个空Object对象
- 对象的__Proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
- 在ES6之前,开发人员可直接操作显式原型,但是不能直接操作隐式原型
-->
<script>
// 创建一个构造函数
function Fun(){
// 内部隐含语句:this.prototype = {}
}
// 1.每个函数function都有一个prototype属性,即显式原型属性,默认指向空的Obejct对象
console.log(Fun.prototype);
// 2.每个实例对象都有一个__proto__ , 可称为隐式原型属性,
// 默认指向和函数相同指向的那个空的Obejct对象
var fun = new Fun(); // 内部隐含语句 this.__ptoto__ = Fun.prototype
console.log(fun.__proto__);
// 3.对象的隐式原型的值为其对应构造函数的显式原型的值
console.log(Fun.prototype === fun.__proto__); // true
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>原型链</title>
</head>
<body>
<!--
1.原型链(图解)
- 访问一个对象的属性(对象也是属性)时
先在自身属性中查找,找到则返回
若没有,则沿着__proto__这条链向上查找,找到则返回
若最终没找到,则返回undefined
- 别名:隐式原型链
- 作用:查找对象的属性(方法)
2.构造方法/原型/实体对象的关系图解
-->
<script>
console.log(Object.prototype)
function Fn(){
this.test1 = function(){
console.log('test1....');
}
}
Fn.prototype.test2 = function(){
console.log("test2.....");
}
var f1 = new Fn();
f1.test1();
f1.test2();
f1.test3();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>原型链补充</title>
</head>
<body>
<script>
function Fn(){
}
// 1.函数的显式原型指向的对象默认是空Object对象,但对于Object函数来说并不满足此条件
console.log(Fn.prototype instanceof Object) // true
console.log(Object.prototype instanceof Object) // false
// Function函数对象的原型也是Object的实例对象
console.log(Function.prototype instanceof Object) // false
// 2.所有的函数都是Function的实例,包括function自身
console.log(Function.__proto__ === Function.prototype) // true
// 3.Object的原型对象是原型链的尽头
console.log(Object.prototype.__proto__) // null
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>原型链_属性问题</title>
</head>
<body>
<!--
1. 读取对象的属性值时: 会自动到原型链中查找
2. 设置对象的属性值时: 不会查找原型链, 如果当前对象中没有此属性, 直接添加此属性并设置其值
3. 方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上
-->
<script type="text/javascript">
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.setName = function (name) {
this.name = name;
}
Person.prototype.sex = '男';
var p1 = new Person('Tom', 12)
p1.setName('Jack')
console.log(p1.name, p1.age, p1.sex)
p1.sex = '女'
console.log(p1.name, p1.age, p1.sex)
var p2 = new Person('Bob', 23)
console.log(p2.name, p2.age, p2.sex)
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>05_探索instanceof</title>
</head>
<body>
<!--
1. instanceof是如何判断的?
* 表达式: A instanceof B
* 如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false
2. Function是通过new自己产生的实例
-->
<script type="text/javascript">
//案例1
function Foo() { }
var f1 = new Foo();
console.log(f1 instanceof Foo);
console.log(f1 instanceof Object);
//案例2
console.log(Object instanceof Function)
console.log(Object instanceof Object)
console.log(Function instanceof Object)
console.log(Function instanceof Function)
function Foo() {}
console.log(Object instanceof Foo);
</script>
</body>
</html>
1. 判断f1是否是Foo的实例,对于f1来说,沿着__proto__向上第一个节点为Foo.prototype, Foo查看prototype的指向,因此两条线路相交于Foo.prototype,则是Foo的实例
2. 判断f1是否是Object的实例, 对于f1来说,沿着__proto__向上第一个节点为Foo.prototype, Object的prototype指向Object.prototype, 各向上走一步并没有相交,f1可沿着__proto__继续向上走,第二个节点指向Object.prototype , 两则在此处相交,因此是Object的实例。