js原型和原型链个人理解(我的理解)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js原型和原型链个人理解(我的理解)相关的知识,希望对你有一定的参考价值。
<script>
//普通对象与函数对象,js万物皆是对象
//自带的
function a1() {
function f1() {}
var f2=function () {}
var f3=new Function(‘str‘,‘console.log(str)‘);
var o3=new f1();
var ol={};
var o2=new Object();
console.log(typeof Object);//function
console.log(typeof Function);//function
console.log(ol);//object{}
console.log(typeof o2);//object
console.log(typeof o3);//object
console.log(typeof f1);//function
console.log(typeof f2);//function
console.log(typeof f3);//function
}
//原型对象
function b1() {
}
function b2 () {
console.log(b1.prototype);//b1 {}
console.log( typeof b1.prototype);//object
console.log(typeof Function.prototype);//function(特殊情况)
console.log(typeof Object.prototype);//object
console.log(typeof Function.prototype.prototype);//undefined
}
//原型作用:继承
var p1=function (name) {
this.names=name;
};
p1.prototype.getM1=function () {
return this.names
};
var name1=new p1();
name1.getM1();
//例子:原型链
console.log(name1.__proto__===p1.prototype);//true
console.log(p1.prototype.__proto__===Object.prototype);//true
console.log(name1.__proto__===Object.prototype);//false
console.log(Object.prototype.__proto__);//null 最大的objct指向的是就是null,这样就表示是原型链
//疑点说明
console.log(Object.__proto__===Function.prototype);//true
//Object它是函数对象,而且是指向Function的
console.log(Function.__proto__===Function.prototype);//true
//Function与Object一样,但不同是指向Function.prototype;
//上面的方式其实是按照现实中的方式来的
//从无到有的情况
//Function.__proto__===Object.prototype其实就是指向自己,没有任何意义
//js一切均是对象,函数也是对象
//constructor预定义属性,用于引用原型函数对象,是循环引用
//父类.prototype.constructor是全等于父类
//Object.constructor==Function,object本身 就是function函数构造的
//constructor是在该对象原型链上寻找的第一个constructor属性所指向的对象:自己总结下:也就是实例化对象指向父类的对象
function d1() {
}
var d2=new d1();
console.log(d2.constructor==d1);//true
console.log(d1.constructor==d2);//false
//原型链生成是靠__proto__ 不是prototype
var animal=function () {};
var dog=function () {};
animal.price=2000;
dog.prototype=animal;
var tidy=new dog;
console.log(dog.price);
console.log(tidy.price);
//通过new方式生成的,会产生链,在操作时,new出来的实例化对象
//obj自动生成一个.__proto__属性,这样,如果没有生成.__proto__属性,使用别的属性时,会undefied未定义,
//但如果使用了obj.attr时,因为obj是一个实例对象,所以在使用attr这个属性时,是不会报错的,会正常输出对应的数据
//只有子类或者实例化对象有__proto__(包括自己,不包括最上面的父类)方法
//prototype会给父类和自自己这个类,如果子类被孙子类继承,那么子类也将有prototype和__proto__属性
以上是关于js原型和原型链个人理解(我的理解)的主要内容,如果未能解决你的问题,请参考以下文章