C++问题“prototype does not match any in class”

C++问题“prototype does not match any in class”,第1张

cpp里有个函数定义

string Person::toString(){}

应改为

string Person::toString() const {}另外,函数中使用的ostringstream在头文件<sstream>中定义,应该#include

用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:

第一步是建立一个新对象;

第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象;

第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作。

其实javascript的new关键字只不过做了五件事情:

1创建Object

2查找class的prototype上的所有方法、属性,复制一份给创建的Object(注意,如果prototype上有属性是function或者数组或者Object,那么只复制指针)

3将构造函数classA内部的this指向创建的Object

4创建的Object的__proto__指向class的prototype

5执行构造函数class

// 定义类 类名字是 classA

functionclassA(){

thisb=1;

}

classAprototypeb=44;

classAprototypeshow =function(){

alert(thisb);

};

// 用new实例化

varb =newclassA();

bshow();

// 用函数实例化

functionnewClass(cls,args){

varobj = {};

for(varpinclsprototype)

obj[p] = clsprototype[p];

obj__proto__ = clsprototype;

clsapply(obj,args||[]);

returnobj;

};

vark = newClass(classA);

kshow();

在 ES6 规范中,引入了 class 的概念。使得 JS 开发者终于告别了,直接使用原型对象模仿面向对象中的类和类继承时代。

但是JS 中并没有一个真正的 class 原始类型, class 仅仅只是对原型对象运用语法糖。所以,只有理解如何使用原型对象实现类和类继承,才能真正地用好 class。

本质上js中class其实是构造函数的另一种写法,使之更加直观的展现构造器中的各项属性

基本使用

注意点:

(1)constructor是一个构造函数方法,创建对象时自动调用该方法

(2)constructor是类必须的一个属性,少了他类的创建会报错,如果我们不写的话js会给他自动加上

(3)this指的是实例化对象,就相当于构造函数中的this,指向的是当前创建的对象

(4)类中声明函数不需要function关键字,直接函数名即可

(5)方法之间不需要都好分割,加了会报错

因为本质上是构造函数的另一种写法,所以他的使用和一些其他特性都是和构造函数相似的。比如调用都是通过new关键字 并且class也存在prototype这个属性,通过她我们可以给这个类的原型对象定义属性。通过这个类创建出的对象一样会有这个属性

类的继承

子类继承基类后,同名的属性会覆盖掉基类,以上例子中两个类都有sayName函数,但是调用的时候输出的是子类的sayName。

一个构造函数可以使用 super 关键字来调用一个父类的构造函数。

同时类也支持get和set *** 作

1、call和apply

二者都可以改变当前的this,区别在于apply方法要将参数放入数组中再传参

2、函数的继承

function Fclass(name, age){

thisname = name;

thisage = age;

}

FclassprototypeshowName = function(){

alert(thisname);

}

FclassprototypeshowAge = function(){

alert(thisage);

}

3、子类

function Sclass(name, age, job){

// 调用父类的call方法并传入子类的this,可实现属性的继承

Fclasscall(this,name,age);

thisjob = job;

}

// 方法继承:将父类的一个实例赋值给子类的继承

Sclassprototype = new Fclass();

SclassprototypeshowJob = function(){

alert(thisjob);

}

var Driver = new Sclass('tom',18,'老司机');

DrivershowName();

DrivershowAge();

DrivershowJob();

4、新增选择器

documentquerySlector()    选择一个

documentquerySlectorAll()   选择一类

jQuery加载:

将获取元素的语句写到页面头部,会因为元素还没有加载而出错,jquery有ready方法解决

//JS写法

windowonload = function(){

var div = documentgetElementById('div');

alert(divinnerHTML);

}

//JQ写法

$(document)ready(function() {

var $div = $('#div');

alert('jquery:' + $divhtml());

})

//简写

$(function(){

var $div = $('#div');

alert('jquery:' + $divhtml());

})

5、jQuery选择器:

$(document) //选择整个文档对象

$('li') //选择所有的li元素

$('#myId') //选择id为myId的网页元素

$('myClass') // 选择class为myClass的元素

$('input[name=first]') // 选择name属性等于first的input元素

$('#ul1 li span') //选择id为为ul1元素下的所有li下的span元素

对选择集进行修饰过滤(类似CSS伪类)

$('#ul1 li:first') //选择id为ul1元素下的第一个li

$('#ul1 li:odd') //选择id为ul1元素下的li的奇数行

$('#ul1 li:eq(2)') //选择id为ul1元素下的第3个li

$('#ul1 li:gt(2)') // 选择id为ul1元素下的前三个之后的li

$('#myForm :input') // 选择表单中的input元素

$('div:visible') //选择可见的div元素

对选择集进行函数过滤

$('div')has('p'); // 选择包含p元素的div元素

$('div')not('myClass'); //选择class不等于myClass的div元素

$('div')filter('myClass'); //选择class等于myClass的div元素

$('div')first(); //选择第1个div元素

$('div')eq(5); //选择第6个div元素

6、选择集转移

$('div')prev('p'); //选择div元素前面的第一个p元素

$('div')prevAll('p'); //选择div元素前面所有的p元素

$('div')next('p'); //选择div元素后面的第一个p元素

$('div')nextAll('p'); //选择div元素后面所有的p元素

$('div')closest('form'); //选择离div最近的那个form父元素

$('div')parent(); //选择div的父元素

$('div')children(); //选择div的所有子元素

$('div')siblings(); //选择div的同级元素

$('div')find('myClass'); //选择div内的class等于myClass的元素

jQuery样式 *** 作:

//读取样式

alert($('div1')css('fontSize'));

//设置样式

$('div1')css({background:'gold'});

//增加行间样式

$('div1')addClass('big');

//减少行间样式,多个样式用空格分开

$('div1')removeClass('div1');

7、click事件

$('#btn')click(function(){

$('box')toggleClass('sty');  //切换样式

});

jQuery索引值:

$('list li')click(function(){

// alert(thisinnerHTML);

// alert($(this)html());

alert($(this)index());

});

jQuery属性 *** 作:

html()

// 取出html内容

var $htm = $('#div1')html();

// 设置html内容

$('#div1')html('<span>添加文字</span>');

text()

// 取出文本内容

var $htm = $('#div1')text();

// 设置文本内容

$('#div1')text('<span>添加文字</span>');

attr():

// 取出的地址

var $src = $('#img1')attr('src');

// 设置的地址和alt属性

$('#img1')attr({ src: "testjpg", alt: "Test Image" });

jQuery特殊效果:

fadeIn() 淡入

fadeOut() 淡出

fadeToggle() 切换淡入淡出

hide() 隐藏元素

show() 显示元素

toggle() 依次展示或隐藏某个元素

slideDown() 向下展开

slideUp() 向上卷起

slideToggle() 依次展开或卷起某个元素

jQuery链式调用

$('#div1') // id为div1的元素

children('ul') //该元素下面的ul子元素

slideDown('fast') //高度从零变到实际高度来显示ul元素

parent()  //跳到ul的父元素,也就是id为div1的元素

siblings()  //跳到div1元素平级的所有兄弟元素

children('ul') //这些兄弟元素中的ul子元素

slideUp('fast');  //高度实际高度变换到零来隐藏ul元素

jquery 通过class获得id方法如下:

$("类名")取对象

$("类名")attr("id") 取对象的ID

JQuery是继prototype之后又一个优秀的Javascript库。它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 60+, FF15+, Safari 20+, Opera 90+),jQuery20及后续版本将不再支持IE6/7/8浏览器。

一、基于原型链的继承

1继承属性

JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依此层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。下面的代码将演示,当访问一个对象的属性时会发生的行为:

[javascript] view plain copy

// 假定有一个对象 o, 其自身的属性(own properties)有 a 和 b:

// {a: 1, b: 2}

// o 的原型 o[[Prototype]]有属性 b 和 c:

// {b: 3, c: 4}

// 最后, o[[Prototype]][[Prototype]] 是 null

// 这就是原型链的末尾,即 null,

// 根据定义,null 没有[[Prototype]]

// 综上,整个原型链如下:

// {a:1, b:2} ---> {b:3, c:4} ---> null

consolelog(oa); // 1

// a是o的自身属性吗?是的,该属性的值为1

consolelog(ob); // 2

// b是o的自身属性吗?是的,该属性的值为2

// o[[Prototype]]上还有一个'b'属性,但是它不会被访问到这种情况称为"属性遮蔽 (property shadowing)"

consolelog(oc); // 4

// c是o的自身属性吗?不是,那看看o[[Prototype]]上有没有

// c是o[[Prototype]]的自身属性吗?是的,该属性的值为4

consolelog(od); // undefined

// d是o的自身属性吗?不是,那看看o[[Prototype]]上有没有

// d是o[[Prototype]]的自身属性吗?不是,那看看o[[Prototype]][[Prototype]]上有没有

// o[[Prototype]][[Prototype]]为null,停止搜索,

// 没有d属性,返回undefined

创建一个对象它自己的属性的方法就是设置这个对象的属性。唯一例外的获取和设置的行为规则就是当有一个 getter或者一个setter 被设置成继承的属性的时候。

2继承方法

JavaScript 并没有其他基于类的语言所定义的“方法”。在 JavaScript 里,任何函数都可以添加到对象上作为对象的属性。函数的继承与其他的属性继承没有差别,包括上面的“属性遮蔽”(这种情况相当于其他语言的方法重写)。

当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。

[javascript] view plain copy

var o = {

a: 2,

m: function(){

return thisa + 1;

}

};

consolelog(om()); // 3

// 当调用 om 时,'this'指向了o

var p = Objectcreate(o);

// p是一个对象, p[[Prototype]]是o

pa = 12; // 创建 p 的自身属性a

consolelog(pm()); // 13

// 调用 pm 时, 'this'指向 p

// 又因为 p 继承 o 的 m 函数

// 此时的'thisa' 即 pa,即 p 的自身属性 'a'

二、使用不同的方法来创建对象和生成原型链

EDIT

1使用普通语法创建对象

[javascript] view plain copy

var o = {a: 1};

// o这个对象继承了Objectprototype上面的所有属性

// 所以可以这样使用 ohasOwnProperty('a')

// hasOwnProperty 是Objectprototype的自身属性。

// Objectprototype的原型为null。

// 原型链如下:

// o ---> Objectprototype ---> null

var a = ["yo", "whadup", ""];

// 数组都继承于Arrayprototype

// (indexOf, forEach等方法都是从它继承而来)

// 原型链如下:

// a ---> Arrayprototype ---> Objectprototype ---> null

function f(){

return 2;

}

// 函数都继承于Functionprototype

// (call, bind等方法都是从它继承而来):

// f ---> Functionprototype ---> Objectprototype ---> null

2使用构造器创建对象

在 JavaScript 中,构造器其实就是一个普通的函数。当使用 new *** 作符 来作用这个函数时,它就可以被称为构造方法(构造函数)。

[javascript] view plain copy

function Graph() {

thisvertexes = [];

thisedges = [];

}

Graphprototype = {

addVertex: function(v){

thisvertexespush(v);

}

};

var g = new Graph();

// g是生成的对象,他的自身属性有'vertices'和'edges'

// 在g被实例化时,g[[Prototype]]指向了Graphprototype

3使用 Objectcreate 创建对象

ECMAScript 5 中引入了一个新方法:Objectcreate()。可以调用这个方法来创建一个新对象。新对象的原型就是调用 create 方法时传入的第一个参数:

[javascript] view plain copy

var a = {a: 1};

// a ---> Objectprototype ---> null

var b = Objectcreate(a);

// b ---> a ---> Objectprototype ---> null

consolelog(ba); // 1 (继承而来)

var c = Objectcreate(b);

// c ---> b ---> a ---> Objectprototype ---> null

var d = Objectcreate(null);

// d ---> null

consolelog(dhasOwnProperty); // undefined, 因为d没有继承Objectprototype

4使用 class 关键字

ECMAScript6 引入了一套新的关键字用来实现 class。使用基于类语言的开发人员会对这些结构感到熟悉,但它们是不一样的。 JavaScript 仍然是基于原型的。这些新的关键字包括 class, constructor,static, extends, 和 super

[javascript] view plain copy

"use strict";

class Polygon {

constructor(height, width) {

thisheight = height;

thiswidth = width;

}

}

class Square extends Polygon {

constructor(sideLength) {

super(sideLength, sideLength);

}

get area() {

return thisheight  thiswidth;

}

set sideLength(newLength) {

thisheight = newLength;

thiswidth = newLength;

}

}

var square = new Square(2);

5性能

在原型链上查找属性比较耗时,对性能有副作用,这在性能要求苛刻的情况下很重要。另外,试图访问不存在的属性时会遍历整个原型链。遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来。

检测对象的属性是定义在自身上还是在原型链上,有必要使用 hasOwnProperty 方法,所有继承自Objectproptotype 的对象都包含这个方法。

hasOwnProperty 是 JavaScript 中唯一一个只涉及对象自身属性而不会遍历原型链的方法。

注意:仅仅通过判断值是否为 undefined 还不足以检测一个属性是否存在,一个属性可能存在而其值恰好为undefined。

6不好的实践:扩展原生对象的原型

一个经常被用到的错误实践是去扩展 Objectprototype 或者其他内置对象的原型。该技术被称为 monkey patching,它破坏了原型链的密封性。尽管,一些流行的框架(如 Prototypejs)在使用该技术,但是并没有足够好的理由要用其他非标准的方法将内置的类型系统搞乱。我们去扩展内置对象原型的唯一理由是引入新的 JavaScript 引擎的某些新特性,比如ArrayforEach。

原生js是效率最高的,这一点毋庸置疑:

首先封装一下:

Objectprototypeexist = function (attrName, attrVal) {

var attr = thisattributes[attrName]value;

return !(attrindexOf(attrVal) < 0);

}

然后调用即可(不限class,支持所有属性,包括你自定义的属性):

var elem = documentgetElementById('re');

var isFind=elemexist('class', 'on');

如果只是为了判断是否添加了某一个样式,那么采用JQuery:

$('#id')hasClass('on');

也可以,至少代码量少,简单!

你不是有个onclick='aa()'的单击事件吗?直接在<head></head>里面写

<script>

function aa(){

windowformbutton属性

}

</script>

就可以了啊

以上就是关于C++问题“prototype does not match any in class”全部的内容,包括:C++问题“prototype does not match any in class”、new关键字具体做了什么、浅析js class等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10083972.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存