300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > JavaScript原型链prototype属性和方法实例详解

JavaScript原型链prototype属性和方法实例详解

时间:2023-05-10 09:57:50

相关推荐

JavaScript原型链prototype属性和方法实例详解

web前端|js教程

JavaScript,prototype,js

web前端-js教程

prototype 对象的任何属性和方法都被传递给那个类的所有实例。原型链利用这种功能来实现继承机制,如果用原型方式重定义前面例子中的类,它们将变为下列形式:

cms系统asp源码,在线vscode,老毛桃 装ubuntu,tomcat 转义,sqlite 储存过程,免费云服务器怎样申请,ie8 svg插件,前端框架 面向接口,爬虫为什么用python,0基础学习php,丝瓜seo1,网站错误模板,网页左右内容筛选,班班空间模板,页面登录代码下载,图书馆管理系统代码设计,网址导航程序生成静态网页lzw

function ClassA() {}ClassA.prototype.color = "blue";ClassA.prototype.sayColor = function () { alert(this.color);};function ClassB() {}ClassB.prototype = new ClassA();

原型方式的神奇之处在于最后一行代码。这里,把 ClassB 的 prototype 属性设置成 ClassA 的实例。这很有意思,因为想要 ClassA 的所有属性和方法,但又不想逐个将它们 添加到ClassB 的 prototype 属性。还有比把 ClassA 的实例赋予 prototype 属性更好的方法吗?

erp软件asp源码,ubuntu分区时花屏,tomcat 安卓模拟器,房间爬虫怎么去除,php数据库用户密码验证,门窗seo团队lzw

注意:调用 ClassA 的构造函数,没有给它传递参数。这在原型链中是标准做法。要确保构造函数没有任何参数。

jsp项目实例源码下载,vscode创建一个文件夹,ubuntu 卡在紫色,tomcat打开后后台运行,网页爬虫速成,php服务器广播,启东seo网络优化公司价格便宜lzw

与对象冒充相似,子类的所有属性和方法都必须出现在 prototype 属性被赋值后,因为在它之前赋值的所有方法都会被删除。为什么?因为 prototype 属性被替换成了新对象,添加了新方法的原始对象将被销毁。所以,为 ClassB 类添加 name 属性和 sayName() 方法的代码如下:

function ClassB() {}ClassB.prototype = new ClassA();ClassB.prototype.name = "";ClassB.prototype.sayName = function () { alert(this.name);};

可通过运行下面的例子测试这段代码:

var objA = new ClassA();var objB = new ClassB();objA.color = "blue";objB.color = "red";objB.name = "John";objA.sayColor();objB.sayColor();objB.sayName();

此外,在原型链中,instanceof 运算符的运行方式也很独特。对 ClassB 的所有实例,instanceof 为 ClassA 和 ClassB 都返回 true。例如:

var objB = new ClassB();alert(objB instanceof ClassA); //输出 "true"alert(objB instanceof ClassB); //输出 "true"

在 ECMAScript 的弱类型世界中,这是极其有用的工具,不过使用对象冒充时不能使用该方法判断。但是由于子类的原型被直接重新赋值,所以出现以下这种情况:

console.log(objB.__proto__===objB.constructor.prototype) //false

因为ClassB的原型链 prototype 属性被另一个类的对象重写了。输出结果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。这也很好理解,给Person.prototype赋值的是一个对象直接量new ClassA()实例,使用对象直接量方式定义的对象其构造器(constructor)指向的是根构造器Object,Object.prototype是一个空对象{},{}自然与ClassB.prototype不等。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。